科普:
- TCP 协议进行通讯的双方(服务端和客户端),是需要先建立一个虚拟连接的,然后双方程序才能发送业务数据信息。
- 建立TCP虚拟连接是通过著名的
三次握手
进行的。
背景:A 和 B 打电话
场景1(3次握手):
A:你好!能听得到我说话吗?
B:你好!听得到!那你能听得到我说话吗?
A:我也能听得到!
场景2(4次挥手):
A:今天我聊得很开心!
B:是的,我也聊得很开心!
B:改天再聊!
A:嗯嗯,改天再聊!
A是:客户端
B是:服务器
问:如果3次握手异常会怎样?
答:服务器会等待客户端重新连接,这时候服务端处于半关闭状态。
如果出现大量的半关闭连接,会耗尽服务器的连接资源数,导致请求无法进来。也就是所谓的DDOS攻击。
问:为什么4次挥手不改成2次挥手?
答:这是由 TCP的半关闭造成的。通信双方都要终止才行。
文言文的解释
3次握手
-
请求端(通常称为客户)发送一个 SYN 段指明客户打算连接的服务器的端口, 以及初 始序号(ISN,在这个例子中为1415531521)。这个SYN段为报文段1。
-
服务器发回包含服务器的初始序号的 SYN报文段(报文段2)作为应答。同时,将确认 序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
-
客户必须将确认序号设置为服务器的 ISN 加1以对服务器的 SYN 报文段进行确认(报文 段3)。 这三个报文段完成连接的建立。这个过程也称为三次握手( three-way handshake)。
4次挥手
- 客户端发起断开,向服务器发送FIN
- 当服务器收到这个FIN,它返回客户端 ACK,确认序号为收到的序号加 1。和SYN一样,一个FIN将占用一个序号。
- 同时 TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。 接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN,
- 客户必须返回一个ACK确认, 并将确认序号设置为收到序号加1。