持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
前言
本文是TCP 的三次握手、四次挥手的第一篇,主要记录了TCP 的三次握手、及其过程的目的等。
TCP 三次握手
TCP 三次握手建立一个TCP连接,需要客户端与服务器发送3个包;
刚开始客户端处于 Closed 的状态,而服务端处于 Listen 状态: CLOSED:没有任何连接状态; LISTEN:侦听来自远方 TCP 端口的连接请求; SYN-SENT :在发送连接请求后等待匹配的连接请求; SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认; ESTABLISHED:代表一个打开的连接,数据可以传送给用户; SYN:连接请求/接收 报文段 ACK:确认报文段
TCP 三次握手的过程
-
第一次握手:客户端向服务端发送一个 SYN 报文,此时客户端处于 SYN_Send 状态。
-
第二次握手:服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答,此时服务器处于 SYN_REVD 的状态。
-
第三次握手:客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,此时客户端处于 Establised 状态。服务器收到 ACK 报文之后,也处于 Establised 状态,至此,双方建立起了 TCP 连接。
三次握手的目的
建立可靠的通信信道,确认双方发送与接收功能是正常;
为什么不能用两次握手进行连接?
三次握手才能确认双发的收发功能都正常,缺一不可。
第一次握手(客户端发送 SYN 报文给服务器,服务器接收该报文);
服务器确认了对方发送正常,自己接收正常;
第二次握手(服务器响应 SYN 报文给客户端,客户端接收该报文):
客户端确认了:自己发送、接收正常,对方发送、接收正常;
服务器确认了:对方发送正常,自己接收正常;
第三次握手(客户端发送 ACK 报文给服务器);
客户端确认了:自己发送、接收正常,对方发送、接收正常;
服务器确认了:自己发送、接收正常,对方发送、接收正常;
半连接队列
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。
当然还有一个全连接队列,完成三次握手后建立起的连接就会放在全连接队列中; 如果队列满了就有可能会出现丢包现象。
SYN 攻击
SYN 攻击就是客户端在短时间内伪造大量不存在的 IP 地址; 向服务器不断地发送 SYN 包,服务器则回复确认包,并等待客户端确认; 由于源地址不存在,因此服务器需要不断重发直至超时; 长时间占用半连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪;
本文到此结束
如果大家还有什么其他想法,欢迎在评论区交流!