1.TCP报文段首部格式
为什么要介绍下首部格式,因为有几个以下概念需要先了解
- 序号(Sequence number):TCP是面向字节流的,传送的每一个字节都按顺序编号,首部的序号字段值指的是本报文所发送的数据的第一个字节的序号。下一次发送的的序号值应为这次的序号加上数据字节长度。
- 确认号(Acknowledgement number):期望对方下一个报文段的第一个数据字节的序号。
- 确认ACK(Acknowledgement):ACK=1为有效。
- 同步SYN(SYNchronization):SYN=1 表示是一个连接,请求或连接报文。
- 终止FIN(FINis):用于释放连接,FIN=1,表示发送方已发送完毕。
2.三次握手
A向B发出连接请求报文段,同步位SYN=1,初始序号seq=x,TCP客户进程进入SYN-SENT(同步已发送)状态。
B收到连接请求报文段后,如果同意连接,向A发送确认。同步位SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y;TCP服务器进程进入SYN-RCVD(同步收到)状态。
A收到确认后,还需向B给出确认 ACK=1,seq=x+1,确认号ack=y+1,A进入ESTABLISHED(已建立连接)状态。
B收到后,也进入ESTABLISHED(已建立连接)状态。
为什么最后A还要发送确认连接?
如果没有最后一次A发送到B的确认,假设第一次连接A发送了两次(A认为第一次发送失败),就会多出一次连接被误以为新连接,就会使B误以为已建立连接,浪费资源。
3.四次挥手
A的连接释放报文终止控制位FIN=1,序号seq=u,A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
B收到连接释放报文后即发出确认,确认号是ack=u+1,自己的序列号为v,B进入了CLOSE-WAIT(关闭等待)状态,此时tcp处于半关闭(half-close)状态,B到A的通道 未关闭。
A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发送连接释放报文。
B发送连接释放报文 FIN=1,seq=w,ack=u+1,B进入LAST-ACK(最后确认状态),等待A的确认。
A收到B的连接释放报文后,必须确认, ack=w+1,seq=u+1,进入TIME-WAIT(时间等待)状态,此时TCP连接没有释放掉。经过时间等待计时器(2MSL)后,A进入到CLOSED状态。
为什么等待2MSK时间
B收不到确认,B会超时重传,等待时间存在,就可以收到重传的报文
防止已失效的连接请求报文。
附:本文参考《计算机网络》第7版-谢希仁