TCP协议:报文格式、三次握手和四次挥手

TCP报文的首部格式

首先来看一下TCP报文的首部格式:

解释:
序号: 本报文段所发出的第一个字节的序号
确认号:期望接收到对方下一个报文的第一个数据字节的序号
ACK:仅当ACK等于1时,确认字段才有效
SYN:在建立连接时用的同步序号。当SYN=1,ACK=0时,表示是连接请求报文段。若响应SYN=1,ACK=1,表示对方同意建立连接
FIN:用来释放一个链接
窗口:从本报文首部的确认号开始,接收方允许对方发送的量
紧急指针:当URG=1时有效。指出紧急数据末尾在报文中的位置

TCP 建立连接的过程(三次握手)

Created with Raphaël 2.1.2 TCP建立连接的过程 Client Client Server Server SYN=1,seq=x SYN=1,ACK=1,seq=y,ack=x+1 ACK=1,seq=x+1,ack=y+1

TCP 关闭连接的过程(四次挥手)

Created with Raphaël 2.1.2 TCP释放连接的过程 Client Client Server Server FIN=1,seq=u ACK=1,seq=v,ack=u+1 数据传送 FIN=1, ACK=1, seq=w, ack=u+1 ACK=1,seq=u+1,ack=w+1 关闭 等待2MSL 关闭


  • 为什么Client在最后一次挥手后要等待2MSL?
    1. 为了保证Client发送的最后一个报文段能到达Server。如果Server未收到最后一个报文,则Client重传一次确认,重新启动2MSL计时器。如果Client不等待2MSL,则无法收到Server重传的FIN+ACK报文段,因此也不会再次发送确认报文段,这样Server就无法正常进入关闭状态。
    2. 防止“已失效的连接请求报文段”处出现在本连接中。即等待2MSL后,可以使连接持续期间所产生的所有报文段都从网络中消失,这样可以使下一个新的连接中不会出现这种旧的连接请求报文段。

MSL: Maximum Segment Life Time,最长报文段寿命。RFC793建议设为2分钟,但这完全是从工程上考虑的,对于现在的网络,MSL=2分钟太长,所以TCP允许不同的实现可根据具体情况使用更小的MSL

TCP的有限状态机

为了更清晰的看出TCP的各个状态,绘制了如下图所示的状态机

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29753285/article/details/81460128