TCP三次握手四次挥手


4/7层网络模型

I.  4层网络模型:应用层、传输层、网络层、网络接口层;
II. 7层网络模型:应用层、表示层、会话层、传输层、网络层、数据链接层、物理层。

TCP协议

TCP是传输层协议,特点是:

  • 基于链接(点对点):传输数据前需要先建立链接,然后再进行传输;
  • 双向通信:链接一旦建立,就可以进行双向通信;
  • 可靠传输:TCP的传输是基于字节流,而不是报文,将数据按字节大小进行编号,接收端通过ACK来确认收到的数据编号,通过这种机制,TCP能够保证接受数据的有效性和完整性;
  • 拥塞控制:通过慢启动、拥塞避免、快重传和快恢复算法达到拥塞控制。

三次握手

TCP是基于链接的,所以在传输数据前需要先建立链接;由于TCP是双工传输,所以不区分Client端和Server端;
为了便于理解,此处把主动发起建立链接的一端称为Client端,把被动建立连接的一端称为Server端。
v2-32b0cc9aa9bbb742d4a27e44a351dba6_720w

I.  首先需要Server端先监听端口,因此Server端建立链接前的初始状态就是Listen状态;
II. Client准备建立链接,先发送一个SYN同步包,发送完同步包后Client端状态就变成了SYN_sent状态;
III.Server端收到SYN后同意建立链接,就向Client端回复一个ACK;由于TCP是双工传输,Server端也会同时向Client端发送一个同步请求SYN,
    申请Server向Client建立链接,发送完ACK和SYN后,Server端的链接状态就变成了SYN_revd;
IV. Client收到Server的ACK后Client的状态就变成了established,同时Client端向Server端发送ACK响应,回复Server端的ACK请求;
V.  Server端收到Client端的ACK后,Server端的链接状态也就变成了established;至此,链接建立完成。

SYN 洪水攻击发生的原因:
Server端收到Client端的SYN请求后,发送了ACK和SYN,但是Client端不进行回复,导致Server端大量的链接处在SYN_rcvd状态,从而影响其他正常请求的建连;可以通过设置tcp_synack_retries=0加快半链接回收速度,或者调大tcp_max_syn_backlog来应对少量的SYN洪水攻击。

四次挥手

由于TCP链接时双工传输,所以每个方向都必须单独关闭,且通信双方都可以先发起,为方便理解,此处把先发起的一方称为Client端。

v2-11125137869b56d61cbb27a4fb92d573_720w

I.  通信双方都是established状态;首先Client发起关闭链接请求,向Server发送FIN数据包,表示Client已经没有数据要发送了,然后进
    入FIN_wait_1状态;
II. Server端收到FIN后返回ACK,然后进入close_wait状态(此时Sever属于半关闭状态,因为此时Client已经不会向Server再发送数据了,
    但Server可能还有数据要向Client端发送);当Server端数据发送完毕后,Server端会向Client端发送FIN,表示Server也没有数据要
    发送了,此时Server端进last_ACK状态,等待Client端的应答。
III.Client端收到Server端的FIN后,回复ACK,然后进入time_wait状态(time_wait状态下需要等待两倍的MSL(最大报文段生成时间)来保
    证链接的可靠关闭),之后进入closed状态。
IV. Server端收到ACK后直接进入closed状态。
    (2MSL的原因:1.要保证TCP协议的双工链接可靠关闭;2.要保证这次链接中重复的数据段能够从网络中消失,防止端口被重用时产生数据混淆)

实际应用中可能遇到大量Socket处于time_wait状态或者close_wait状态,一般开启tcp_tw_reuse和tcp_tw_recyle能够加快time_wait的链接回收;而如果有大量链接处于close_wait状态,则可能是被关闭的一方存在代码BUG,没有正确关闭链接导致。