前言
TCP报文段结构

三次握手

语文老师这样解释:
- 客户向服务器发送连接请求段:SYN 报文段:(SYN=1,seq=x)
- SYN=1:建立连接请求控制段
- seq=x:表示传输的报文段的第 1 个数据字节的序列号是 x,并以此序列号代表 整个报文段的序号(补充:sequence number,序号的意思。) 客户端进入 SYN_SEND(同步发送)
- 服务器收到 TCP 连接请求段后,如同意,则发回确认报文段: (SYN=1,ACK=1,seq=y, ack_seq=x+1)
- SYN=1:同意建立新连接的确认段
- ack_seq=x+1:表示已经收到了序列号为 x 的报文段,准备接收序列号为 x+1 的报文段
- seq=y:服务器告诉客户确认报文段的第 1 个数据字节的序列号是 y
- 服务器由 LISTEN 进入 SYN_RCVD(同步收到)
- 客户对服务器的 同意连接报文段 进行确认: (ACK=1,seq=x+1,ack_seq=y+1)
- seq=x+1:客户传输的报文段的第一个数据字节的序列号是 x+1
- ack_seq=y+1:客户期望接收服务器序列号为 y+1 的报文段。
- 当客户发送 ACK 时,客户端进入 ESTABLISHED 状态
- 当服务收到 ACK 后,也进入 ESTABLISHED 状态(只有在第三次握手可携带数据)
语文成绩不好的我这样解释:
- 男:今天有空吗?
- 女:今天正好有空
- 男:你看这家店怎么样?我发你了,我觉得不错,我们去吃吧!
四次挥手

语文老师这样解释:
- 客户向服务器发送释放连接报文段:(FIN=1,seq=u)
- 首部的 FIN=1:TCP 报文段的发送端数据发送完毕,请求释放连接
- 序号 seq=u:表示传输的第一个数据字节的序号是 u
- 客户端状态由 ESTABLISHED 进入 FIN_WAIT_1(终止等待 1 状态)
- 服务器向客户发送确认段:(ACK=1,seq=v,ack_seq=u+1)
- ACK=1:标识确认字号段有效
- 确认序号 ack_seq=u+1:表示服务器期望接收客户数据包序号为 u+1 的包
- 序号 seq=v:表示服务器传输的第一个数据字节的序号是 v
- 服务器状态由 ESTABLISHED 进入 CLOSE_WAIT(关闭等待)
- 客户端收到 ACK 段后,由 FIN_WAIT_1 进入 FIN_WAIT_2
- 服务器向客户发送释放连接报文段:(FIN=1,ACK=1,seq=w,ack_seq=u+1)
- FIN=1:请求释放连接
- ACK=1:标识确认字号段有效
- 确认序号 ack_seq=u+1:表示服务器期望接收客户数据包序号为 u+1 的包
- 序号 seq=w:表示自己传输的第一个数据字节的序号是 w 服务器状态由 CLOSE_WAIT 进入 LAST_ACK(最后确认状态)
- 客户向服务器发送确认段:(ACK=1,seq=u+1,ack_seq=w+1)
- ACK=1:标识确认字号段有效
- 确认序号 ack_seq=w+1:表示客户期望接收服务器数据包序号为 w+1 的包
- 序号 seq=u+1:表示客户传输的第一个数据字节的序号是 u+1
- 客户端状态由 FIN_WAIT_2 进入 TIME_WAIT,等待 2MSL 时间,进入 CLOSED 状态,释放连接
- 服务器在收到最后一次 ACK 段后,由 LAST_ACK 进入 CLOSED,释放连接
语文成绩不好的我这样解释:
- 男:宝宝,我要挂电话了哦
- 女:不行,我还在敷面膜,再陪我一会儿
- 女:我好了,你可以挂啦
- 男:我舍不得挂了,你挂吧
- 女:好吧,那我挂啦
- 男:等了2MSL后听到嘟嘟的挂断声