随笔分类
三次握手
SYN 同步序列编号,是 TCP / IP建立连接时使用的握手信号
在客户端和服务器端之间建立正常的 TCP网络连接时,客户端首先发出 SYN信息,服务器端使用 SYN-ACK应答表示接收到了这个消息,最后客户机再以 ACK信息响应
这样在客户端和服务端之间才能建立可靠的 TCP连接,数据才可以在客户端和服务端之间传递
主要用于客户端与服务器端的建立连接
三次握手的目的是 建立可靠的通信信道
,简单来说就是数据的发送与接收,三次握手的主要目的便是双方确认自己与对方的发送与接收是正常的
第一次握手:Client是什么都不能确认;Server确认了对方能够正常发送,自己接收正常
- 客户端 — 发送带有 SYN标志的数据包 —一次握手 — 服务端
第二次握手:Client确认了自己接收和发送正常,对方发送、接收正常;Server确定对方发送正常,自己接收正常
-
服务端 — 发送带有 SYN / ACK标志的数据包 — 二次握手 — 客户端
-
第二次握手传回了 ACK,主要是为了告诉客户端,服务器端接受的消息就是客户端发送的消息,以来表明客户端到服务端的通信是正常的
而传回 SYN,则是为了建立服务器端到客户端之间的通信
第三次握手:Client确认了自己发送、接收正常,对方发送、接收正常;Server确认了自己发送、接收正常,对方发送、接收正常
- 客户端 — 发送带有 ACK标志的数据包 — 三次握手 — 服务端
因此,三次握手能够确认双方收发功能都正常,缺一不可
为什么不去使用二次握手,四次握手?
首先,三次握手就能够确保接收双方发收消息能力的正常,那再去使用四次握手不就多余了吗?还多了开销
然后就是二次握手的话,服务器端并不知道客户端接收消息是否正常
- 如果二次握手成功了,那还好说
- 如果在建立连接时出现了网络拥塞,比如说在客户端第一次发送 SYN信号时出现了拥塞,然后客户端没有接收到服务器端的 ACK信号,就认为该链接请求丢失了,就会去重新发送 TCP连接请求,倘若此信号只是由于网络拥塞和暂时堵塞而已,那么网络连通后该 TCP请求又会到服务器端,由于是二次握手嘛,服务器端接收了 SYN信号后就会去将资源分配给客户端,但是客户端已经认为此连接信号丢失了,就不会再去利用此建立的连接请求进行数据通信了,也就说该建立的连接不会被使用,这不就是白白浪费了服务器的资源
- 而且试想网络特别拥塞,那么网络连通后,就会出现一堆不被使用的已经建立好的连接,这不就是浪费了一堆资源,后面可能对于正常的连接请求都无法处理了