一文看懂TCP基础之三次握手4次挥手

Abstract

本文主要关注了TCP连接中最关键的部分就是如何建立连接和关闭连接.
写这个文章的目的主要还是总结备忘TCP相关的联系

TCP 三次握手

什么是TCP三次握手?

TCP 三次握手主要用于建立TCP连接.其中涉及3个TCP包.
一个连接的建立过程:

  1. 客户端发送SYNC包:
    在这里插入图片描述
  2. 服务端回复SYNC+ACK包:
    在这里插入图片描述
  3. 客户端回复ACK包
    在这里插入图片描述

Q&A

2次行不行?

不行. 因为如果客户端发送的SYNC由于网络延迟发送了, 那么客户端重新发SYNC包, 然后服务器建立了连接. 前面SYNC的包又到了, 那么会重复建立连接.

4次行不行?

可以. 但是效率不高.
如果TCP的握手是四次:
–1.client给server发送SYN同步报文;
–2.server收到SYN后,给client回复ACK确认报文;
–3.server给client发送SYN同步报文;
–4.client给server发送ACK确认报文。
第2.3步之间,server和client没有任何的数据交互,分开发送相当于多发了一次TCP报文段,SYN和ACK标识只是TCP报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率。

什么是backlog

在建立连接时, 客户端发送SYNC,服务器收到SYNC后, 服务器端会将该请求放入SYNC队列(服务器端半连接队列), 然后服务器发送SYNC+ACK给客户端, 客户端收到SYNC+ACK后, 在客户端连接标记为Established, 然后客户端发送ACK, 服务器检查ACCEPT队列, 如果ACCEPT队列满, 要么丢弃要么直接回复RST(参数tcp_abort_on_overflow). 如果ACCEPT队列没有满, 则将该连接从SYNC队列移入ACCEPT队列.
ACCEPT队列大小=min(backlog, somaxconn) = default is 50
SYNC队列大小=max(64, tcp_max_sync_backlog)
在这里插入图片描述
如果客户端发送ACK较晚, 服务端直接RST.

TCP 4次挥手

什么是 TCP四次挥手

TCP关闭连接的过程. 取决于谁先trigger关闭连接:
在这里插入图片描述

Q&A

为什么是4次?

TCP是全连接(两边可以同时收发数据), 所以为了保证TCP被正常关闭设计的4次挥手.

什么是TIMED_WAIT

参考上图. 主动关闭的一方.
1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2.可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。
————————————————
版权声明:本文为CSDN博主「Shyg」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yucdsn/article/details/81092679

什么是Close_wait

被动关闭的一方. 如果服务器出现大量close_Wait只能证明代码没有写对. (比如收到对方close后, 自己不及时退出而是发了ACK后 却不继续发送FIN 可能是还有很多数据要发, 也可能是卡住了.)

下面是一个例子: 示例代码

猜你喜欢

转载自blog.csdn.net/scugxl/article/details/86543361