Abstract
本文主要关注了TCP连接中最关键的部分就是如何建立连接和关闭连接.
写这个文章的目的主要还是总结备忘TCP相关的联系
TCP 三次握手
什么是TCP三次握手?
TCP 三次握手主要用于建立TCP连接.其中涉及3个TCP包.
一个连接的建立过程:
- 客户端发送SYNC包:
- 服务端回复SYNC+ACK包:
- 客户端回复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 可能是还有很多数据要发, 也可能是卡住了.)
下面是一个例子: 示例代码