TCP报文结构以及三次握手,四次挥手过程
TCP报文结构
tcp报文结构,参考知乎图片
其中序号代表报文开始字节的序号,序号是建立tcp连接时候随机生成的,之后每下一个的序号是上一个报文的确认号,ack = (y+1)
其中数据偏移有4bit,偏移长度最大60字节
校验和包括了首部和数据部分,还要加上12字节的伪首部来进行校验和计算
TCP连接管理
TCP建立连接三次握手:
1.客户端发送TCP连接请求给服务器,此时TCP报文序列号seq=x,同步标志SYN=1
进入SYNC_SENT状态。
2.服务器接收到TCP连接请求,确认seq=x
报文,设置请求回复报文确认号ack = x+1
,同时设置同步标志SYN=1,序列号seq=y
,即发送syn+ack报文给客户端。并进入SYNC_RECV状态。
3.客户端接收到服务器发送的syn+ack报文,并返回 ack = y+1
的确认报文给服务器,同时客户端进入SYNC_ESTABLISH状态,服务器接收到确认报文后同样进入该状态。完成三次握手。
TCP四次挥手断开连接:
1.客户端发送TCP结束连接请求,并且停止发送数据,释放报文首部,发送请求报文设置标志位FIN=1,序列号seq=u
给服务器,并进入FIN-WAIT-1状态。 第一次挥手
2.服务器收到后,发送确认报文标志位ACK=1,确认号ack=u+1,序列号seq=v
给客户端,此时服务器进入了半关闭状态,此时服务器进入CLOSE-WAIT状态,服务器TCP服务进程会通知高层应用客户端不会有新的数据传输了,但是如果服务器发送数据给客户端,客户端仍然要接受
。 第二次挥手
3.客户端接收到seq=v
的报文后,确认服务器知道释放连接通知了,客户端进入FIN-WAIT-2状态,之后要等待服务器发送最终释放连接信号才能关闭TCP连接,在此期间还要接收服务器发送的剩余报文
。 第二次挥手
4.服务器端发送完最后的数据后,发送释放连接报文标志位FIN=1,确认号ack=u+1,序列号seq=w
给客户端,此时,服务器进入LAST-ACK最后确认释放状态,等待客户端的确认报文回复即可释放连接。 第三次挥手
5.客户端接收到服务器最终释放请求报文后,必须发送确认报文给服务器,确认报文标志位ACK=1,确认号ack=w+1,序列号seq=t
发送给服务器,客户端进入TIME-WAIT状态,此时连接还没有释放,之后要等待2*MSL(最大报文寿命时间)
后,客户端客户撤销TCB中相应的TCP连接的内容信息后,才完全关闭连接,进入CLOSED状态。这里服务器是比客户端先进入CLOSED状态的
,因为服务器接收到关闭连接确认报文要比 2*MSL 等待时间后要更早一些。四次挥手完成。 第四次挥手
TCB (transmission control block)
TCB (transmission control block) is like a table that maintains all TCP sessions
TCB是一个包含了TCP连接的所有会话状态的资源块,用于在不同设备之间传输数据时由于有设备差异,因此采用TCB进行封装数据。在发起TCP连接请求前,客户端会主动创建TCB,而服务器会被动建立TCB,从而才能合理获取到请求信息的内容。
TCB里面包含了如下的资源的字段
- 连接ID connection ID
- 套节字序号 socket numbers
- 缓存 buffers
- 正在使用的TCP报文 segements in use
- 队列 queue
- 其他字段 others