关于TCP的三次握手和四次挥手

389 阅读3分钟

前言

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后听到嘟嘟的挂断声

参考链接

github.com/Advanced-Fr…