TCP/IP协议Linux网络

TCP三次握手和四次挥手超完善总结

2019-06-08  本文已影响9人  9ac64e1f7a99

TCP 三次握手(建立连接)

三次握手

三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。

第1次握手

客户端:

第2次握手

服务器:

第3次握手

客户端:

客户端此包发送完毕之后,客户端和服务器进入 ESTABLISHED(TCP 连接成功) 状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

TCP 四次挥手(断开连接)

四次挥手

第1次

客户端:

第2次

服务器:

TCP 通知应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接收。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。

客户端:

第3次

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,由于在半关闭状态,服务器很可能又发送了一些数据。假定此时的序列号为 seq=w

服务器:

第4次

客户端:

客户端接收到服务器的连接释放报文之后,必须发出确认。

服务器:

服务器比客户端先进入 CLOSED 状态。

为什么3次握手

当 Server 收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN、ACK 报文。ACK 报文做应答, SYN 报文用来同步。

3 次握手做好发送数据的准备工作,同时也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

前两次握手进行同步和准备,第三次握手进入状态。

为什么不是2次握手呢?

如果一个连接请求在网络中跑得慢,超时了,这时客户端会重发请求,但这个跑的慢的客户端最后还是跑到了,然后服务端就接收了两个请求,然后全部回应就会创建两个连接,浪费资源。如果加入第三次验证,则客户端接收到一个服务端确认连接请求之后,后面再接收到确认连接请求就可以抛弃不管了。

为什么4次挥手

TCP 是双向的,所以需要在两个方向分别关闭,每个方向的关闭又需要请求和确认,所以一共就4次。

如果已经建立了连接,但是客户端出现故障该怎么办

TCP 有一个保活计时器,客户端出现故障了,服务器是不能一直等下去浪费资源的的。

服务器每收到一次客户端请求后都会重新复位这个计时器,时间通常为 2h ,如果 2h 还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔 75s 就会发送一次。若一连发送10个探测报文仍然没有反应,服务器就认为客户端出现故障,接着就关闭连接。

洪水攻击

SYN 洪水攻击发送在3次握手的前2次,攻击者发送 TCP SYN,SYN 是 TCP 三次握手中的第一个数据包,当服务器返回 ACK 后,攻击者不对其进行再确认,那这个连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送 ACK 给攻击者,这会导致服务器资源被浪费。攻击者对服务器发送非常大量的这种 TCP 连接,由于大量半连接状态在服务器产生,服务器的资源消耗会不断增加,最后导致服务器故障。

服务器发送 ACK 之后处于 SYN_RECV 状态,服务器只有收到客户端的 ACK 之后,才会转入 ESTABLISHED 状态。

缩略词相关

SYN、ACK、FIN 这些大写的单词表示标志位,其值只有0、1;小写的 seq、ack 表示序号。

SYN、ACK、FIN 存放在 TCP 的标志位。

字段 含义
ACK 确认号是否有效,一般置为1
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设为1
FIN 希望断开连接
URG 紧急指针是否有效。为1表示某一位需要被优先处理
PSH 提示接收端应用程序立即从 TCP 缓冲区把数据读走
RST 对方要求重新建立连接,复位

推荐阅读

看了那么多,TCP/IP究竟是什么(一)

TCP三次握手和四次分手

vuejs 中双向绑定的模拟实现

止水lx

一个想要分享点知识的公众号,关注送技术资料

wxqrcode

微信号:lxfriday_xyz

上一篇 下一篇

猜你喜欢

热点阅读