首页 > 代码库 > TCP三次握手和四次挥手

TCP三次握手和四次挥手

技术分享TCP报文的头部信息: SEQ SYN ACK FIN此时会用上

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。

FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接

SEQ:每个字节花费一个序号,例如一个报文seq=301,传输100字节的数据,表示第一个字节的序号301,最后一个字节序号400,下一个报文的序列号从seq=401开始

序列号和确认号用于分析和确认是否丢包,防止乱序

技术分享

TCP可靠连接三次握手过程:

1、客户端发送一个SYN报文给服务器,请求服务器打开某个端口与之连接

2、服务器发送ACK报文给客户端确认打开某个端口与之连接,并发送SYN报文请求客户端打开某个端口与之连接

3、客户端发送ACK报文确认打开某个端口与之连接

技术分享

TCP可靠连接四次挥手过程:

1、客户端发送FIN报文请求服务器释放客户端连接的端口

2、服务器发送ACK报文确认服务器断开与客户端端口的连接

3、服务器发送FIN报文请求客户端释放服务器连接的端口

4、客户端发送ACK报文确认客户端断开与服务器连接的端口


当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1,  服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。  A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。

为什么要等待呢?

为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求后 WAIT_TIME会重新记时)


另外服务器B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢?  就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。


本文出自 “个人学习笔记” 博客,谢绝转载!

TCP三次握手和四次挥手