TCP的选项

时间:2021-08-20
本文章向大家介绍TCP的选项,主要包括TCP的选项使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

2021-08-20

滑动窗口中ACK的问题:

由于采用的是累计ACK确认,TCP不能正确的确认之前已经接受的数据,由于接受的数据是无序的,所以接受到数据的序列号也是不连续的。在这种情况下,TCP接收方需要防止引用程序使用超出空洞的数据

由此引出了SACK(选择确认选项)---可以使得TCP发送发能够了解到接收方当前的空洞(以及在序列空间中超出空洞的乱序数据块),这样就能在报文段丢失或被接受方遗漏时更好的进行重传工作

TCP状态转换图:

 RET字段(重置报文段)

当发现一个到达的报文段对于相关连接而言是不正确的时,TCP就会发送一个重置报文段

针对不存在端口的请求:

当一个连接请求到达本地却没有相关进程在目的端口侦听时就会产生一个重置报文段(TCP),UDP协议规定当一个数据报到达一个不能使用的目的端口时会生成一个ICMP目的地不可达消息;

终止一条连接

FIN是有序释放,因为FIN实在之前所有排队数据都已发送后才被发送出去,通常不会出现数据丢失的情况;

然而在任何时刻,我们都可以通过发送一个重置报文段替代FIN来终止一条连接。

终止一条连接可以提供两大特性:

  • 任何排队的数据都将被抛弃,一个重置报文段会被立即发送出去
  • 重置报文段的接收方会说明通信另一端采用了终止的方式,而不是一次正常关闭

SOCKET选项(SO_LINGER)可以实现该选项

半开连接

如果在未通知另一端的情况下,通信的一端关闭或终止连接,就称为半开状态。此种情况一般发生在通信方主机崩溃的情况下(反正不是正常关机)

一进入连接队列

一个并行的服务器会为每一个客户端分配一个一个新的进程或线程,这样负责侦听的服务器能够始终准备着处理下一个到来的连接请求。

新的连接可能会处于两种状态:

  • 一种是连接尚未完成但是已经接受到SYN(也就是处于SYN_RCVD状态)
  • 另一种是连接已经完成了三次握手并且处于ESTABLISHED状态,但还未被应用程序接受

linux中规定:

当一个连接请求到达(即SYN报文段),将会检查系统范围的参数(默认为1000),如果处于SYN_RCVD状态的连接数目超过了这一阈值,进入的连接将会被拒绝

如果队列中已经没有足够的空间分配给新的连接,TCP将会延迟对SYN做出响应,从而给应用程序一个跟上节奏的机会。

原文地址:https://www.cnblogs.com/221lin/p/15168249.html