前置知识
序号——seq number
TCP会为字节流中的每一个字节都加上一个编号, 本字段的值代表本次发送数据的第一个字节的序号,如:序号seq为0,代表第一个要发送的字节编号为0;
若数据长度为10,则此报文的编号为0~9
确认号——ack
表示:已经正确接收的编号为N,要求发送端下一个应该发送的序号为N+1。
例如:ack=10,表示前10个,即0~9编号的字节都已经全部接收到了
报文头中的ACK&SYN:为标志位
ACK:确认标志位。
ACK为1:表示确认号ack有效
SYN为1:表示这是一个连接请求报文 / 连接接受报文
握手
- 第一次握手
客户端:SYN=1,表示想要建立连接;同时产生一个随机序号seq=X(我的序号是X),并将该数据包发送给服务端,此时客户端进入:sent状态 - 第二次握手
服务端:收到数据包后,由“SYN=1”知道客户端想建立连接,则服务端:
SYN=1(连接接受)、ACK=1(我的确认号ack是有效的);
seq=Y(产生一个随机值,以确认连接请求)、ack=X+1(表示对客户端X的确认,已经准备好接收序号为X+1的报文) - 第三次握手
客户端:ACK=1,seq=X+1、ack=Y+1(对服务端序号Y的确认,已经准备好接受序号为Y+1的报文),此时客户端进入:established状态,服务端收到报文后也进入这个状态。
为什么需要三次握手?
- 保证通信双方都有能力发送信息并且接受响应
- 第一次:客户——>服务:
服务端知道:客户端的发送正常,服务端的接收正常
(他能发,我能收) - 第二次:服务——>客户:
客户端知道:客户端发送正常,客户端接收正常;服务端发送正常,服务端接收正常。
(我刚刚发的,发成功了,对方也收到了;对方现在发的,对方能发送,自己也能接收) - 第三次:客户——>服务:
服务端知道:服务端发送正常;客户端接收正常。
(我刚刚发的,我发送成功了,对方也收到了)
4次挥手
2MSL时间的两个重要原因
1.最后的ACK报文
2.以防收到过期的报文