tcp协议深入
tcp通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输
1. 序列号+确认应答
在tcp中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ack); 序列号是按照顺序给发送数据的每一个字节都标上号码的编号。 接收端查询接收数据tcp首部中的序列号和数据的长度,将自已下一步应该接收的序号作为确认应答返送回去
2. 重发超时
重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔,如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。 理想的重发超时具体时长是找到一个最小时间,它能保证确认应答一定能在这个时间内返回
数据也不会无限、反复地重发。 达到一定重发次数后,若仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接,并通知应用通讯异常强行终止
3. 连接管理
为了准确无误地将数据送达目标处,tcp协议采用了 三次握手 (three-way handshaking)策略。 用tcp协议将数据包送出去后,tcp一定会向对方确认是否成功送达。 若在握手过程中某个阶段莫名中断,tcp协议会再次以相同的顺序发送相同的顺序包。 而 四次挥手 (four-way wavehand)即终止tcp连接,就是指断开一个tcp连接时,需要客户端和服务端总共发送4个包以确认连接的断开
三次握手,即建立连接
第一次握手:客户端发送一个带syn标志的tcp报文到服务器。 这是三次握手过程中的段1
第二次握手:服务器端回应客户端,是三次握手中的第2个报文段,同时带ack标志和syn标志。 它表示对刚才客户端syn的回应; 同时又发送syn给客户端,询问客户端是否准备好进行数据通讯
第三次握手:客户必须再次回应服务器端一个ack报文,这是报文段3
数据传输
客户端发出段4,包含从序号1001开始的20个字节数据。
服务器发出段5,确认序号为1021,对序号为1001-1020的数据表示确认收到,同时请求发送序号1021开始的数据,服务器在应答的同时也向客户端发送从序号8001开始的10个字节数据,这称为piggyback。
客户端发出段6,对服务器发来的序号为8001-8010的数据表示确认收到,请求发送序号8011开始的数据
四次挥手,即关闭连接
第一次挥手:客户端发出段7,fin位表示关闭连接的请求
第二次挥手:服务器发出段8,应答客户端的关闭连接请求
第三次挥手:服务器发出段9,其中也包含fin位,向客户端发送关闭连接请求
第四次挥手:客户端发出段10,应答服务器的关闭连接请求
下图是一次完整的三次握手、数据传输以及四次挥手的wireshark抓包测试
4. 流控制
在建立tcp连接时,可以确定发送数据包的单位,即最大消息长度(mss:maximum segment size)。 mss是在三次握手的时候,在两端主机之间被计算得出的。 两端的主机在发出建立连接的请求时,会在tcp首部中写入mss选项,告诉对方自已的接口能够适应的mss大小,然后会在两者之间选择一个较小的值投入使用
tcp以一个段为单位,若每发一个段进行一次确认应答的处理,会导致往返时间较长通信性能较低。 为了解决该问题,引入了窗口这个概念,使得确认应答不再是以每个分段,而是以更大的单位进行确认
窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。 这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。 在收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置,就可以顺序地将多个段同时发送以提高通信性能。 这种机制也被称为滑动窗口控制
上图就是一个滑动窗口控制实例,其详细流程见如下分析:
发送端发起连接,声明最大段尺寸是1460,初始序号是0,窗口大小是4k,表示“我的接收缓冲区还有4k字节空闲,你发的数据不要超过4k”。 接收端应答连接请求,声明最大段尺寸是1024,初始序号是8000,窗口大小是6k。 发送端应答,三方握手结束。
发送端发出段4-9,每个段带1k的数据,发送端根据窗口大小知道接收端的缓冲区满了,因此停止发送数据。
接收端的应用程序提走2k数据,接收缓冲区又有了2k空闲,接收端发出段10,在应答已收到6k数据的同时声明窗口大小为2k。
接收端的应用程序又提走2k数据,接收缓冲区有4k空闲,接收端发出段11,重新声明窗口大小为4k。
发送端发出段12-13,每个段带2k数据,段13同时还包含fin位。
接收端应答接收到的2k数据(6145-8192),再加上fin位占一个序号8193,因此应答序号是8194,连接处于半关闭状态,接收端同时声明窗口大小为2k。
接收端的应用程序提走2k数据,接收端重新声明窗口大小为4k。
接收端的应用程序提走剩下的2k数据,接收缓冲区全空,接收端重新声明窗口大小为6k。
接收端的应用程序在提走全部数据后,决定关闭连接,发出段17包含fin位,发送端应答,连接完全关闭。
下图是一次完整的滑动窗口控制实例的wireshark抓包分析:
开启以socket客户端,发送2593个字节的数据到开发板
使用wireshark抓包工具,抓取完整的收发过程
机器人正在重塑零售业领域,并带来巨大的经济效益
雷达物位计的应用、优势及性能
AMOLED成下一波面板技术决战点 日韩厂群雄争霸
人脸识别花屏闪屏之EMC静电干扰解决方案
华为下一代WLAN无线融智网络 开启新方向
一文详解TCP协议
全球热点:移动数据业务发展
盘式永磁直流电机的结构
pcb常见缺陷汇总
金融和大模型的“两层皮”问题
RFID技术加持无人仓库管理智能化建设
三大国产手机小米、vivo、oppo都长一个样?性价比却很高
锐捷RG-S8600E系列交换机的特点以及光模块的应用
科技赋能健康空气环境,带来环境检测仪产品方案
基于工控机的机器视觉,将开启智造新世界
画好原理图的几个技巧
怎样用Arduino制作无限时钟
“机器人+”时代来临 智能安防近在眼前
话筒放大器电路图大全(六款话筒放大器电路设计原理图详解)
可穿戴设备与AI技术在医疗领域中相结合