加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_马鞍山站长网 (https://www.0555zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

聊点TCP干货

发布时间:2019-05-30 02:40:16 所属栏目:教程 来源:美码师
导读:副标题#e# 我们在平时的开发中,或多或少都会涉猎到网络传输这块。 这篇文章,主要是整理一下 TCP 的一些知识要点,作为一名开发者来说,尽管有那么多的基础设施(框架、组件)帮我们屏蔽了这些细节。但我仍然认为了解它的一些基本原理必有些裨益,尤其是当你

实际上,在应用层调用 socket listen 时也支持设置一个 backlog参数,这几个之间的关系如下:

  1. 半连接队列长度 = min(backlog,内核 net.core.somaxconn,内核 tcp_max_syn_backlog) 
  2. 全连接队列长度 = min(backlog,内核 net.core.somaxconn) 

黑板:一般的应用服务器如 netty、tomcat 都支持设置 backlog 参数,但是在真正进行调优时还需要配合考虑内核参数的配置。

五、 四次挥手

聊点 TCP 干货

在释放连接时,由于TCP是全双工的,因此最后要由两端分别进行关闭,这个流程如下:

  • 客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FINWAIT1状态。
  • 服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务器进入CLOSEWAIT状态,而客户端进入FINWAIT2状态。
  • 服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入LASTACK状态。
  • 客户端收到FIN后,客户端进入TIMEWAIT状态,接着发送一个ACK给服务器,确认序号为收到序号+1,服务器进入CLOSED状态,完成释放。

关闭连接有主动关闭和被动关闭一说,这里为了简化理解,我们以客户端作为主动关闭方,服务器为被动关闭方。

四次挥手需要关注的问题:

问题1. 为什么是四次挥手

发送FIN的一方就是主动关闭(客户端),而另一方则为被动关闭(服务器)。

当一方发送了FIN,则表示在这一方不再会有数据的发送。

其中当被动关闭方受到对方的FIN时,此时往往可能还有数据需要发送过去,因此无法立即发送FIN(也就是无法将FIN与ACK合并发送),

而是在等待自己的数据发送完毕后再单独发送FIN,因此整个过程需要四次交互。

问题2. 什么是半关闭

客户端在收到第一个FIN的ACK响应后,会进入FINWAIT2 状态时,此时服务器处于 CLOSEWAIT状态,这种状态就称之为半关闭。

从半关闭到全关闭,需要等待第二次FIN的确认才算结束。此时,客户端要等到服务器的FIN才能进入TIMEWAIT,

如果对方迟迟不发送FIN呢,则会等待一段时间后超时,这个可以通过内核参数tcpfin_timeout控制,默认是60s。

问题3. 为什么服务器会有大量 closewait

半关闭的状态下的服务器连接会处于 closewait 状态,直到服务器发送了FIN。

(编辑:网站开发网_马鞍山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!