大家好,关于TCP连接管理(三):服务器选项很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
1. 端口号
我们的实验环境是使用macOS系统的ssh命令连接Ubuntu系统的22端口(sshd应用程序),观察其端口号的使用情况。 sshd 应用程序实现Secure Shell 协议(RFC4254),该协议提供经过加密验证的远程终端功能。下图为已启动openssh-server服务的终端端口监听状态:
终端安装ssh服务并启用ipv4/ipv6双栈协议。 netstat -ant 命令用于显示所有状态TCP 连接。返回结果显示主机正在监听ipv4和ipv6双协议的22端口。 ipv4的本地地址是0.0.0.0,ipv6的本地地址是:22。这种地址表示方法也称为“通配符地址”,这意味着目标为22端口的传入连接请求(SYN)将在任何本地接受界面。
现在我们从另一台主机打开22端口的连接,并检查22端口的连接状态,返回结果如下:
端口号22 的最后一行是ESTABLISHED 连接。该行显示了与本地节点连接相关的四元组,包括本地IP地址和端口号、外部IP地址和端口号、本地IP地址和连接请求。取决于到达的接口。处于LISTEN状态的本地节点继续单独运行,并为新的传入连接创建新的连接节点。现在我们使用相同的系统向服务器发起ssh连接,并使用netstat -ant命令查看连接:
现在我们有两个从同一客户端发起的处于ESTABLISHED 状态的连接。两个连接的目的端口号都是22,因此源主机的端口号必须不同。大多数TCP应用程序使用随机的本地端口与服务器建立连接,并且该端口必须是未被其他连接(包括处于FINWAIT和TIMEWAIT状态的连接)使用的端口。
这个例子说明TCP依靠四元组解复用来获取报文段,无法仅根据目的端口号来确定哪个进程应该接收接收到的报文段。所有节点中,只有处于LISTEN状态的节点才能接收SYN报文并建立新连接。
接下来我们启动从另一个系统到服务器的连接。端口连接情况如下:
在此多宿主主机上,第三个TCP 连接的IP 地址与本地IPv4 接口地址(192.168.199.201) 关联,使用不同的四元组建立另一个ESTABLISHED 状态连接。
2. 当地限制
通过修改sshd配置文件,我们可以将服务绑定到特定的本地IP地址。从外部主机到端口22 的请求必须发送到此地址才能接收响应。服务器监听端口如下:
如果我们从目标地址不是192.168.199.201(甚至本地地址127.0.0.1)的主机连接到服务器,则连接请求将不会被TCP模块处理。通过查看tcpdump,我们可以看到SYN会触发RST消息:
服务器应用程序不会意识到连接请求,因为拒绝操作是由操作系统的TCP模块根据应用程序的配置发出的,并且系统对本地IP的限制非常严格。
3.外部节点限制
RFC0793中引入的TCP抽象接口函数允许服务器对完全指定的外部节点或未指定的外部节点进行被动打开,但一般的TCP模块实现中不支持这种方法。服务器无法指定外部节点,只能等待客户端到来,然后检查客户端的IP地址和端口号。
服务器允许的地址绑定中,最常见的是将所有本地地址的特定端口号与所有外部地址和端口号绑定,或者绑定本地地址的指定端口号(如127.0.0.1)(不常见,常用的DNS服务器),并且通常不支持将特定端口号绑定到外部特定地址。 TCP模块收到连接请求时,首先匹配限制性最强的地址绑定方式,最后匹配所有本地地址和所有外部地址(*.local_port – *.*)的绑定方式。
4. 连接队列
并行服务器可以为每个到达的客户端分配一个进程或线程,以便监听服务器始终准备好处理下一个到达的连接请求。但是,当连接到达时,服务器正在创建新进程,或者运行其他优先级更高的进程,可能会有多个请求同时到达,操作系统会进行如下处理:
1. 当连接请求到达时,TCP会检查系统变量net.ipv4.tcp_max_syn_backlog(默认为1000)。如果SYN_RCVD状态的连接数超过该值,新的连接将被拒绝。
2、每个服务器都有一个定长的队列(Queue),里面存储已经进入ESTABLISHED状态但还没有被应用程序使用的连接。这通常称为未完成的连接(积压)。 backlog 的值必须介于0 和系统变量net.core.somaxconn 之间。默认值为128。
3. 如果队列中还有分配给新连接的空间,TCP 将响应SYN 并完成连接。当客户端完成连接并开始传输数据时,服务器上的连接可能尚未被应用程序使用。此时,TCP会将连接发送的数据存储到队列中。
4、如果队列已满,TCP会延迟响应SYN请求,系统会尽量不忽略收到的每一个连接请求。只要客户端继续等待,就会获得服务器分配的连接资源。系统变量net.ipv4.tcp_abort_on_可以设置为1,新传入的连接将被RST消息重置。
连接队列溢出时不建议发送重置报文段,因为连接队列已满的服务器通常处于正常繁忙状态,在有空闲资源时仍然可以继续建立连接。如果服务器发送RST消息,客户端就会认为服务器出现了问题,服务就会中断。然后就会放弃主动打开操作,停止向服务器发起连接。最合理的方法是暂时延迟对溢出队列连接的响应,不主动重置连接。客户端会等待一段时间来获取连接。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/141884.html
用户评论
岁岁年年
这篇文章说的太对!作为开发者,理解TCP Server Options确实很重要,可以更好地控制和管理连接,提升服务器性能。
有11位网友表示赞同!
闲肆
我一直好奇TCP连接是怎么建立的,这篇博客对我很有帮助。特别是那部分解释选项如何影响连接速度和安全性,让我受益匪浅。
有17位网友表示赞同!
断秋风
我以前也没想到还可以通过选项来管理TCP连接,这真是一点开眼界了!”服务器侧的设置能这么详细地讲解还真不多见,谢谢作者分享!
有12位网友表示赞同!
慑人的傲气
看完这篇博客,很多东西还是觉得不太懂,比如MSS和TFO这些选项具体怎么用呢?感觉还需要结合一些代码示例来理解更透彻。
有18位网友表示赞同!
陌上蔷薇
我对TCP协议一直感兴趣,这篇文章讲解的比较深入,特别是对于服务器端的选项做了详细分析,对我学习很有帮助。希望作者能继续写更多关于网络协议的文章!
有17位网友表示赞同!
失心疯i
这篇文章重点放在了服务器端选项的配置,我觉得对于客户端来说也有很多需要了解的地方啊。比如哪些选项对于用户的使用体验有影响?
有12位网友表示赞同!
丢了爱情i
我正在设计一个高并发服务器系统,这篇博客帮助我更好地理解TCP连接管理的重要性,我会把这些选项认真学习一下。
有5位网友表示赞同!
歆久
读了这篇文章后,感觉很多技术细节还是比较深奥的,建议作者能提供一些更具体的案例分析,更容易明白其中的原理。
有18位网友表示赞同!
你很爱吃凉皮
服务器选项确实很重要,但我觉得文章中的一些描述比较枯燥乏味,能不能换个方式来解释,让读者更容易吸收?
有15位网友表示赞同!
素婉纤尘
我之前接触过TCP连接管理,但是这篇博客让我对一些概念有了更深入的理解。特别是“接收窗口”和“慢启动算法”的解释,非常清晰易懂!
有17位网友表示赞同!
浮殇年华
其实对于很多普通用户来说,这些TCP选项不太重要吧?文章能不能着重写些与用户的实际体验相关的内容? 比如如何优化网络流量?避免掉线?
有18位网友表示赞同!
一生只盼一人
服务器选项确实可以提高系统的性能,但我觉得过度关注这些配置可能会忽略其他更重要的因素,比如硬件资源的分配和应用程序本身的设计。
有6位网友表示赞同!
别伤我i
这篇文章给了我很好的思路,但我希望能看到一些代码示例,以便更好地理解如何实际运用这些服务器选项
有19位网友表示赞同!
忘故
读完这篇博客后,我感觉自己离真正掌握TCP协议还有很长一段距离…希望以后能找到更多关于网络编程的优质资源!
有11位网友表示赞同!
绝版女子
最近在研究网络安全问题,发现TCP连接管理也扮演着重要的角色。这篇文章深入分析了服务器选项的作用,对我的学习很有帮助!
有13位网友表示赞同!
?娘子汉
我之前以为TCP连接就只是建立和关闭那么简单的事情,没想到还会涉及这么多的选项配置,真是让人大开眼界啊! 感觉还有很多东西需要学习…
有7位网友表示赞同!
十言i
这篇文章文笔很清晰易懂,内容也很客观。作者对TCP协议的理解很透彻,推荐给所有想了解 TCP 连接管理的朋友!
有7位网友表示赞同!