网络传输--TCP

TCP网络编程

一、TCP简介

二、TCP网络程序--客户端

三、TCP网络程序--服务端

四、TCP知识总结

五、文件下载案例

六、3次握手和4次挥手

回到顶部

一、TCP简介TCP

1.TCP的简介

  TCP通信需要通过创建链接, 数据传送, 终止链接3个步骤

  

2.TCP的特点

  面向连接: 建立间接, 通信, 关闭连接. 这种连接方式是一对一的, 所以不支持广播模式

  可靠传输

    应答机制: TCP发送的报文段必须都得到接受方的应答,才可以进行下步传输

    超时重传: TCP发送报文段的时候, 会启动定时器, 在规定时间内没有回应, 就进行重发

    错误校验: 由发送端计算,然后由接收端验证, 在此过程中出现差误的话, 则会直接丢弃这个包

    流量控制和阻碍管理: 根据实际情况来进行调整发送速度

  优缺点:

    优点: 可靠, 稳定传输数据

    缺点: 传输速度慢, 占用系统资源高, 不可以进行广播传输

  TCP和UDP的区别:

TCP 面向连接; UDP 是不面向连接;

TCP 提供可靠的数据传输,也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP 不保证可靠的数据传输,容易出现丢包情况;

TCP 需要连接传输速度慢,UDP 不需要连接传输速度快

TCP 不支持发广播; UDP 支持发广播

TCP 对系统资源要求较多,UDP 对系统资源要求较少。

TCP 适合发送大量数据,UDP 适合发送少量数据

TCP 有流量控制,UDP 没有流量控制

二、TCP网络程序--客户端

***注意***

在使用windows的网络调试助手的过程中, 此软件传出的字节是GBK的编码, 但接收的过程中是Unicode的编码形式

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket

# 1.买个电话 -- 创建TCP套接字   参数是 地址协议版本 套接字类型
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.拨号 创建和服务器的链接
tcp_socket.connect((‘192.168.33.68‘, 8080))

# 3.发送数据
choose = input(">>>:")
tcp_socket.send(choose.encode())

# 4.接受数据 阻塞等待数据 recv返回值一般情况下 就是对方发送的数据; 如果对方断开了链接 返回值就是 ‘‘
recv_data = tcp_socket.recv(1024)
if not recv_data:
    print("对方断开链接")
else:
    print(recv_data.decode(‘gbk‘))

# 5.关闭套接字
tcp_socket.close()

客户端

三、TCP网络程序--服务端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket

# 1.总机 - 创建TCP套接字<服务器套接字 监听套接字>
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.固定号码 - 固定端口
server_socket.bind((‘‘, 8888))

# 3.安装客户服务系统 - 主动 -> 被动监听模式
server_socket.listen(128)

while True:
    # 4.从等待服务区取出一个客户端用以服务 转接到分机 - 接受链接
    # (<socket.socket 和客户端关联起来的套接字对象), raddr=(‘172.17.99.129‘, 53614)>, (‘172.17.99.129‘, 53614))
    client_socket, client_addr = server_socket.accept()
    print("接受来自%s的数据请求" % str(client_socket))

    while True:
        # 5.使用分机进行深入的交流 - echo 回射服务器
        recv_data = client_socket.recv(1024)
        print("接受数据:%s" % recv_data.decode(‘gbk‘))
        client_socket.send(recv_data.decode(‘gbk‘).encode())
        if not  recv_data:
            print("客户端下线了")
            break

    # 6.分机挂机
    client_socket.close()

# 7.主机挂机
server_socket.close()

服务端

四、TCP知识总结

1.TCP 服务器一般情况下都需要绑定端口号,否则客户端找不到这个服务器
2.TCP 客户端一般不绑定端口号,使用随机生成的端口号即可
3.TCP 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 TCP 服务器时必须要做的
4.当 TCP 客户端和服务端建立好连接才可以收发数据,UDP 是不需要建立连接,直接就可以发送数据
5.当一个 TCP 客户端和服务端连接成功后,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
6.listen 后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
7.关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
8.关闭 accept 返回的套接字意味着这个客户端已经服务完毕
9.当客户端的套接字调用 close 后,服务器端会 recv 解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

五、文件下载案例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket

# 1.建立和服务器的连接
# 1.1 用户输入IP地址和端口
IP = input("服务器IP:")
port = int(input("服务器端口:"))

# 1.2 创建TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 1.3 连接服务器
tcp_socket.connect((IP, port))

# 2.向服务器发送需要下载文件的名称
# 2.1 输入文件名称
file_name = input(‘需要下载的文件名称:‘)

# 2.2 发送
tcp_socket.send(file_name.encode())

# 3.一遍接收文件数据 一遍写入数据
# 3.1 打开文件用于保存 接收到的数据
file = open("下载" + file_name, "wb")
while True:
    # 3.2 接收数据 写入文件
    file_data = tcp_socket.recv(4096)

    # 3.3 如果数据是‘‘ 传输完成 关闭文件 套接字  否则继续3.2的步骤
    if not file_data:
        print("文件下载完成")
        file.close()
        tcp_socket.close()
        break
    file.write(file_data)

客户端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket

def main():

    # 1.创建和客户端的连接
    # 1.1 创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 1.2 绑定端口
    tcp_socket.bind((‘192.168.33.68‘, 8888))

    # 1.3 监听
    tcp_socket.listen(128)

    # 1.4 接收连接

    while True:
        clent_socket, clent_addr = tcp_socket.accept()
        print("接收来自%s的连接" %  str(clent_socket))

        # 2.接收客户端发送的文件名
        # 2.1 使用和客户关联的套接字对象 接收数据
        file_name = clent_socket.recv(4096)
        if not file_name:
            print("客户端已经断开链接")
            clent_socket.close()
            continue
        # 2.2 文件名称解码成 str
        new_file_name = file_name.decode()

        # 3.根据文件名称 读取文件数据 发送给客户端
        # 3.1 打开文件
        with open(new_file_name, "rb") as file:
            # 3.2读取整个文件的数据
            data = file.read() # 如果文件大 可能导致程序出现风险

            # 3.3 向客户端发送数据
            clent_socket.send(data)

    tcp_socket.close()

if __name__ == ‘__main__‘:
    main()

服务端

六、3次握手和4次挥手

3次握手

              

    标志位:

      SYN: 表示连接请求  ACK: 表示确认  FIN: 表示关闭连接  seq:表示报文序号  ack: 表示确认序号

第一次握手:
    Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

第二次握手:
    Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给 Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:
    Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

4次挥手

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送。

第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+1。

原文地址:https://www.cnblogs.com/Mryang123/p/9979250.html

时间: 2024-11-13 07:56:23

网络传输--TCP的相关文章

网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信. 使用TCP还是UDP,那要看你的程序注重哪一个方面,可靠(tcp)还是快速(udp). TCP/IP 建立连接的过程 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.   

TCP网络传输“粘包”问题,经典解决(附代码)

一.前言 关于TCP网络传输粘包,网上很多人写了原理.总结起来就一句话:这里拿Server和Client长连接,Server和Client之间通过信令传输做说明: Server发送的时候按照一条条信令发送,到达操作系统网络层,首先进入缓冲池,然后TCP协议层从池子中获取数据,传输给Client.我们知道TCP的传输有几个方案,比如,滑动窗口.1比特方案.所以Client收到的数据已经不可能是一个个完整的信令的. 个人理解TCP粘包的概念:它描述了一个场景:"信令是一个个紧挨着的,好像是被粘在一起

Oracle工具之--ASM与文件系统及跨网络传输文件

Oracle工具之--ASM与文件系统及跨网络传输文件   Oracle DBMS_FILE_TRANSFER可以实现文件系统和ASM磁盘组之间实现文件传输及ASM磁盘组之间跨网络的传输. DBMS_FILE_TRANSFER:   The DBMS_FILE_TRANSFER package provides procedures to copy a binary file within a database or to transfer a binary file between datab

ASP.NET知识总结(1.网络传输层)

1.网络传输层 1应用层(HTTP.FTP.SMTP)报文Message 2传输层(TCP.UDP)报文段Segment,为运行在不同主机上的应用程序进程间提供数据 传输服务.通过套接字(Socket)实现. TCP(传输控制协议)面向连接的.可靠(应用:ftp.smtp.http等都是基于tcp) UDP(用户数据报协议)无连接的.不可靠的(数据报)应用:视频会议.网络电话. DNS解析.(速度快,能容忍部分数据丢失) 3网络层(IP)数据报datagram,把数据从一台主机移动到另一台主机,

JAVA网络编程-----tcp

java采用TCP传输时利用Socket和ServerSocket Socket和ServerSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输. 关闭Socket 同样,客户端与服务端是两个独立的应用程序. 演示tcp传输 1.   tcp分客户端和服务端 2.   客户端对应的对象是Socket,服务端对应的对象是ServerSocket. 客户端: 通过查阅socket对象,发现在该对象建立时,就可以连接指定主机, 因为tcp是面向连接的,所以在建立so

DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store

背景: 上一篇博文对DICOM中的网络传输进行了介绍.主要參照DCMTK Wiki中的英文原文.通过对照DCMTK与fo-dicom两个开源库对DICOM标准的详细实现,对理解DICOM标准有一个更直观的认识.此篇博文是对上一篇博文的补充.由于专栏前面的演示样例大多是利用DCMTK工具包来进行的,此次借着分析fo-dicom源代码结构的机会,參照fo-dicom的README.md,给出C-ECHO 和C-STORE服务的详细实现.在实现的同一时候给出DICOM3.0标准中的相关介绍,帮助我们理

网络基础---TCP/IP五层模型

网络基础---TCP/IP五层模型 计算机之间的通讯是通过互联网来进行的,各个计算机在internet上遵循它的一系列协议才能进行通讯,因此实际上可以把互联网本质看作是一系列的网络协议. 1.TCP/IP五层模型 (1)物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0 (2)数据链路层的功能:建立逻辑连接.进行硬件地址寻址.差错校验等功能(由底层网络定义协议).并且将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正. 1)以广播的方式通

网络传输流量控制策略小结

 这里所说的流量控制策略,适用于TCP可靠传输协议,可能不适合UDP传输协议. 一般来说,流量控制策略可分为应用层流量控制.传输层流量控制两种. 1.应用层流量控制 也就是,在应用程序内部开发逻辑实现流量控制,根据带宽控制策略来决定是否进一步发送或接收. 网络传输时,通过回调机制来动态显示带宽大小.动态显示带宽的时机或指标(固定以秒/毫秒为单位显示速率都会对性能有影响,也肯定不是最优的),根据需要动态显示速率: 1>时间采样周期(如250毫秒)越细,流量控制越准确,但可能造成传输性能的降低.

DICOM医学图像处理:DICOM网络传输

背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的.当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就是扩展名为DCM文件的格式说明.其实不然,随着对医疗行业的深入,对DICOM协议也有了更全面的认识.而今才发现DCM文件只是DICOM协议一部分中的一小节,仅仅是整个协议中的一个数据结构,而DICOM协议更多的是关于医疗行业各种服务及相关流程的约定,因此其实DICOM协议中最主要的是信息流,是对医院