#yyds干货盘点#TCP协议报文结构详解之三次握手和四次挥手

Posted 王华_linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#TCP协议报文结构详解之三次握手和四次挥手相关的知识,希望对你有一定的参考价值。

1.建立连接

2.TCP三次握手

3.TCP四次挥手

3.有限状态机 FSM:Finite State Machine

CLOSED 没有任何连接状态

LISTEN 侦听状态,等待来自远方TCP端口的连接请求

SYN-SENT 在发送连接请求后,等待对方确认

SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

ESTABLISHED 代表传输连接建立,双方进入数据传送状态

FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

CLOSING 双方同时尝试关闭传输连接,等待对方确认
客户端先发送一个FIN给服务端,自己进入FIN_WAIT_1状态,这时等待接收服务端报文,该报文会有三种可能:

只有服务端的ACK

只有服务端的FIN

基于服务端的ACK,又有FIN

1、只收到服务器的ACK,客户端会进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_WAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间, RFC 1122标准的建议值是2min).客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次。因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道ACK已丢失

2、只有服务端的FIN时,回应一个ACK给服务端,进入CLOSING状态,然后接收到服务端的ACK时,进入TIME_WAIT状态

3、同时收到服务端的ACK和FIN,直接进入TIME_WAIT
状态客户端的典型状态转移

客户端通过connect系统调用主动与服务器建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态

此后connect系统调用可能因为如下两个原因失败返回:

1、如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用,则服务器将给客户端发送一个复位报文段,connect调用失败。

2、如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。connect调用失败将使连接立即返回到初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,连接转移至ESTABLISHED状态

当客户端执行主动关闭时,它将向服务器发送一个结束报文段,同时连接进入FIN_WAIT_1状态。若此时客户端收到服务器专门用于确认目的的确认报文段,则连接转移至FIN_WAIT_2状态。当客户端处于FIN_WAIT_2状态时,服务器处于CLOSE_WAIT状态,这一对状态是可能发生半关闭的状态。此时如果服务器也关闭连接(发送结束报文段),则客户端将给予确认并进入TIME_WAIT状态

客户端从FIN_WAIT_1状态可能直接进入TIME_WAIT状态(不经过FIN_WAIT_2状态),前提是处于FIN_WAIT_1状态的服务器直接收到带确认信息的结束报文段(而不是先收到确认报文段,再收到结束报文段)

处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT状态,否则它

将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在

FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未

等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类

似)

Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数: /proc/sys/net/ipv4/tcp_max_orphans 指定内核能接管的孤儿连接数目 /proc/sys/net/ipv4/tcp_fin_timeout 指定孤儿连接在内核中生存的时间

4.客户机端的三次握手和四次挥手状态转换


==服务器端的三次握手和四次挥手状态转换==

5.sync半连接和accept全连接队列


/proc/sys/net/ipv4/tcp_max_syn_backlog 未完成连接队列大小,默认值128,建议调整大小为1024以上
/proc/sys/net/core/somaxconn完成连接队列大小,默认值128,建议调整大小为1024以

以上是关于#yyds干货盘点#TCP协议报文结构详解之三次握手和四次挥手的主要内容,如果未能解决你的问题,请参考以下文章

Linux TCP/IP协议之三次握手

#yyds干货盘点#网络协议之:socket协议详解之Unix domain Socket

#yyds干货盘点#https工作原理详解

#yyds干货盘点#--Linux下iptables的常用知识点

#yyds干货盘点#Java学习18

TCP协议详解