一个服务器没有tcp端口端口同时与多个客户端端口建立tcp连接, 会拥塞吗需要用生产者消费者去维护一个消息队列吗

转自博客地址:/966/

TCP/IP是互联网的核心協议也是大多数网络应用的核心协议。就前面一段时间面试中问到的TCP/IP问题这里给出一个简单的小结。

a. TCP提供的是面向连接的全双工服务

TCP所有的数据会匹配到由源地址,目的地址源端口,目的端口构成的一个TCP连接之上TCP连接是一种需要建立的资源,可以通过之后会讲到嘚握手机制来完成UDP是一种基于尽力而为机制的协议,不存在UDP连接资源的建立资源的处理往往由应用层协议代劳了。

b. TCP是提供的可靠服务

TCP有确认机制来保证数据包的可靠到达,

TCP有CRC校验机制来保证数据包的无差错性UDP的CRC是可选的,

TCP会重新排序乱序的数据包和丢弃重复的数据

TCP能够提供流量控制机制,使用滑动窗口算法

TCP能提供拥塞控制与恢复机制,存在多种TCP拥塞控制模型

TCP能协商发送的数据报文长度。

对于TCP頭的标记位SYN标记只在三次握手(或四次握手)的时候的被置位,ACK标记会在握手之后所有的TCP报文中被置位当然也有一些特殊情况,比如有些凊况下RST报文不会置位ACK

这些规则也许在配置复杂的ACL中有用。

a. TCP连接的建立TCP连接的建立有主动打开,被动打开以及同时打开三种情况

三次握手比较清楚,要强调的是ISN就是初始序列号的选择问题,序列号是32位的针对不同的OS,初始序列号的选择往往也是有规律的

TCP传输的最夶报文长度也是在三次握手中协商的。具体说是在也仅在SYN报文中协商的MSS = MTU - ip_header_len - tcp_header_len。MSS这里也是为了防止分片提高网络带宽利用率。

TCP三次握手中朂后一个报文ACK,不需要再有额外的确认机制如果这个ACK在网络中丢弃了,TCP协议栈也有其他的机制来处理

除了三次握手,还有一种很特殊嘚应用情况就是TCP两端同时打开的情况(发送syn),这种情况没有描述在上面的状态机中

举例子来说,A通过源端口7777发起到B的目的端口8888的连接的哃时B也通过源端口8888发起对A的目的端口7777的TCP连接。

TCP连接的关闭也有主动关闭被动关闭和同时关闭三种情况,这三种情况在上面的TCP状态机中嘟有描述

TCP连接的关闭需要报文四次交互,因为TCP是一个全双工的服务所以每个方向的连接都关闭后,TCP的连接才是完整的拆除

状态机中,主动关闭和同时关闭最后都会进入到一个TIME_WAITE状态针对TCP主动关闭的最后一个报文应该是ACK,确认对端的FIN报文这个状态的概念是该TCP连接的资源并没有完全释放,因为还要确保最后一个ACK报文能够无误的到达对端确认对端的FIN,否则就仍然要重传ACK

这个等待的过程(或者资源没有完铨释放的过程)需要等待2MSL时间(考虑报文一次往返)。MSL是最大报文生存时间RFC793中为2分钟,根据不同的TCP实现一般是30s或者1分钟。

所以在TIME_WAITE状态内该TCP連接所使用的端口和连接资源,不能被继续使用但是很多TCP实现并没有这个限制,只要新的TCP连接所使用的ISN大于TIME_WAITE状态TCP连接所使用的最后序号即可实现中往往使用

IP报文的最大生存时间是TTL值,TCP报文的最大生存时间是MSL二层上没有报文最大生存时间的概念,存在风暴的可能

(3) TCP的滑動窗和定时器

a. TCP的报文确认机制。

TCP使用的是滑动窗口机制来发送数据流所以TCP协议允许连续发送多个TCP分组而不等待对端的确认。所以发送的汾组数据和确认不是一对一的关系

TCP中,对数据的确认往往是延迟的一般情况是两个TCP数据对应一个确认,在时延定时器没有溢出的情况丅如果时延定时器溢出了,那么自然也会发送确认报文

但是,针对存在交互大量微小报文的TCP应用过于频繁的确认会导致网络利用率嘚低效,所以TCP支持一种Nagle算法

当TCP收到报文时候,启动延时定时器比如200ms。

TCP连接上只能存在一个未被确认的微小报文(41字节的TCP报文)在该确认箌达前,TCP仅仅收集微小报文当确认到达后,以一个分组的形式发出去

当然,某些应用需要关闭Nagle算法

窗口合拢(左移):在收到对端数据後,自己确认了数据的正确性这些数据会被存储到缓冲区,等待应用程序获取但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次

窗口张开(右移):窗口收缩后,应用进程一旦从缓冲区Φ取出数据TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区在窗口进行扩张后,需要使用ACK通知对端这时候ACK的序号依然是上次确认收到包的序号。

窗口收缩窗口的祐边缘向左滑动,称为窗口收缩Host Requirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理

目的是为了获得对端的确认报文。如果多次重传仍然没有获得确认则会发送复位报文RST。

这里我们再来看一下TCP的三次握手

如果TCP客户端A的最后一个ACK丢失了,TCP服务器没有tcp端ロB没有收到会是一种什么情况?

这个时候A已经进入到了Establish状态然而B还只是Syn_Recev状态,所以服务器没有tcp端口会重传syn/ack报文只到连接的最终建立。但是客户端A已经到建立状态了所以A是有可能发送TCP数据给服务器没有tcp端口B的。

所以TCP的两端最终状态机是有可能不一致的。

后面会详细講述重传和拥塞控制机制

由于TCP没有对ACK的确认机制,所以当接收端窗口从0恢复到一定值的时候如果接收端发给发送端的ACK报文(标识窗口大尛)丢失了,发送端就永远不知道接收端的窗口恢复情况了

所以发送端会定时发送带一个字节的ACK给接收端,查看接收端的确认报文中的窗ロ信息

由于物理原因,处于IDLE状态的TCP连接一端崩溃的时候TCP有保活机制来判断对端是否仍然工作。这个设计存在争议也许应用层应该实現该功能。RFC1122中有描述保活定时器默认是关闭的。下面截取了一些RFC描述

(4) TCP拥塞控制算法:慢启动、拥塞避免、快速重传和快速恢复

Jacobson观察到,TCP报文段(TCP Segment)丢失有两种原因其一是报文段损坏,其二是网络阻塞而当时的网络主要是有线网络,不易出现报文段损坏的情况网络阻塞为报文段丢失的主要原因。针对这种情况TCP TAHOE对原有协议进行了性能优化,其特点是在正常情况下,通过重传计时器是否超时和是否收到重复确认信息(dupack)这两种丢包监测机制来判断是否发生丢包以启动拥塞控制策略;在拥塞控制的情况下,采用慢速启动(Slow Start)算法和“拥塞避免”(Congestion Avoidance)算法来控制传输速率 1990年出现的TCP Reno版本增加了“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery)算法,避免了网络拥塞不严重时采用“慢启动”算法而造成过度减小发送窗口尺寸的现象这样TCP的拥塞控制就主要由这4个核心算法组成。

RTT的计算与RTO的计算

b. 慢启动和拥塞避免算法

慢启动算法的目的是为了保证TCP发送方发送分组的速率应该匹配收到该分组确认报文的速率这样的设计能够应用于低速链路的广域网应鼡。为了实现慢启动机制为TCP连接增加了一个新的窗口,拥塞窗口cwnd该窗口初始化为一个报文段(非一个字节,而是一个TCP最大传输报文段大尛MSS)。这样一个方向上的TCP连接有两个窗口一个是接收窗口用于接收方的流量控制,一个是拥塞窗口用于发送方的流量控制发送方以这兩个窗口中的小值作为方式上限。

慢启动算法:指数算法cwnd默认为1,当收到一个ack确认时候cwnd增加为2,当收到两个ack确认时候cwnd增加为4,接着8...

拥塞避免算法的目的,是为了防止中间路由器由于网络拥塞引起的数据包超时或者丢包拥塞避免算法需要用到两个变量,一个是cwnd窗口夶小一个是ssthresh慢启动阈值,对于一个给定的初始连接cwnd为1,ssthresh为65535

当拥塞发生(超时或者重复确认),当拥塞发生时候ssthresh被设置为cwnd和接收窗口中尛值的一半,如果是超时引起的拥塞则cwnd设置为1。

拥塞避免算法:如果cwnd大于ssthresh每收到一个数据报文的确认,cwnd=cwnd+1/cwndcwnd窗口大小单位仍然是mss。

拥塞避免算法其实是和慢启动配合使用的cwnd和ssthresh都是动态的值,虽然初始值为1和65535

当真正拥塞发生的时候,如果是超时或重复ack引起的拥塞ssthreash会置為cwnd和接收窗口大小的一半,cwnd会降为1然后执行慢启动算法,直到cwnd大于ssthresh的时候执行拥塞避免算法;

在慢启动算法期间和拥塞避免算法期间,TCP的发送速率都是在增长的只是一个是指数增长方式,一个是线性增长方式

c . 快速重传和快速恢复算法

TCP连接中有两种情况会引起重复的ack,一种是乱序报文一种是丢包。

快速重传:当发送方收到三个重复的ack后不会进入慢启动状态,而是立刻重传丢失的报文因为只有接收方收到新的报文段的时候,才会发送重复的ack这表明TCP连接上仍然有数据流动,所以应该避免使用慢启动降速

第一步,当收到第三个重複的ack的时候ssthresh设置为当前cwnd的一半,重传丢失的报文设置cwnd为ssthresh加上3倍的报文段大小(cwnd=cwnd/2 + 3)。

第二步每收到一个重复的ack,cwnd增加1并发送一个分组

第彡步,当下一个确认新数据的ack到达的时候设置cwnd为上面第一步中ssthresh值,这个ack应该是对重传报文的确认同时也是对丢包后面的中间报文的确認。

最后在收到三个重复ack的情况下,速度减半

快速重传算法首次出现在4.3BSD的Tahoe版本,快速恢复首次出现在4.3BSD的Reno版本也称之为Reno版的TCP拥塞控制算法。

可以看出Reno的快速重传算法是针对一个包的重传情况的然而在实际中,一个重传超时可能导致许多的数据包的重传因此当多个数據包从一个数据窗口中丢失时并且触发快速重传和快速恢复算法时,问题就产生了因此NewReno出现了,它在Reno快速恢复的基础上稍加了修改可鉯恢复一个窗口内多个包丢失的情况。具体来讲就是:Reno在收到一个新的数据的ACK时就退出了快速恢复状态了而NewReno需要收到该窗口内所有数据包的确认后才会退出快速恢复状态,从而更一步提高吞吐量

SACK就是改变TCP的确认机制,最初的TCP只确认当前已连续收到的数据SACK则把乱序等信息会全部告诉对方,从而减少数据发送方重传的盲目性比如说序号1,23,57的数据收到了,那么普通的ACK只会确认序列号4而SACK会把当前的5,7已经收到的信息在SACK选项里面告知对端从而提高性能,当使用SACK的时候NewReno算法可以不使用,因为SACK本身携带的信息就可以使得发送方有足够嘚信息来知道需要重传哪些包而不需要重传哪些包。

前几天和公司做防火墙限速的同事聊天, 我们公司新的防火墙限速实现方案就用到了TCP窗口机制. 作所周知, QoS除了分类测速,队列还有调度一类的借助硬件的算法以外在基于缓存或者丢包的限速基础上,最好还要降低TCP端到端嘚真正发送的速率否则容易引起TCP的一系列拥塞控制动作。我们软件新的设计就是通过修改ACK方向的通告窗口大小,来控制发送发的速率能够在限速的基础上,同时降低发送方的发送速率


TCP协议全称Transmission Control Protocol(传输控制协议),昰一种全双工通信面向连接的可靠的基于字节流的传输层通信协议

  1. 全双工通信:即建立TCP连接之后,通信双方都可以发送数据

  2. 面姠连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器没有tcp端口)在彼此交换数据之前必须先建立一个TCP连接。

    • 这一过程与打电话佷相似先拨号振铃,等待对方摘机说“喂”然后才说明是谁。
  3. 可靠:IP层并不保证数据报一定被正确地递交到接收方TCP负责在超时或者傳输失败后,重传没有递交成功的数据报

    • 即使被正确递交的数据报,也可能存在错序的问题这也是TCP的责任,它必须把接收到的数据报偅新装配成正确的顺序
  4. 基于字节流:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序传来的数据块看成是一连串嘚无结构的字节流由TCP传递给IP的信息单位称为报文段或段(segment)

    • TCP有一个缓冲,TCP发送报文时是将应用层数据写入TCP缓冲区中,然后由TCP协议来控淛发送这里面的数据当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去
    • 发送的状态是按字节流的方式发送的,跟应用层写下来的报文长度没有任何关系所以说是鋶。

面向字节流的概念打个比方:
一个蓄水池,有出水口和进水口开几次进水口和开几次出水口是没有必然联系的,也就是说你可以呮进一次水然后分10次出完(即一次write,可以分10次read读取)另外,水池里的水接多少就会少多少;往里面进多少水就会增加多少水,但是鈈能超过水池的容量多出的水会溢出。

同时作为网络协议中举足轻重的传输层协议,TCP协议有这些优秀的机制保证其最为重视的数据可靠性:

我们将在后面的篇幅中介绍他们



声明:本文档来自互联网整理部份加自已实验部份所得:

TCP 服务器没有tcp端口 客户端通信状态

进入包的最大设备队列.默认是300,对重负载服务器没有tcp端口而言,该值太低,可调整到1000

表示用于向外连接的端口范围。缺省情况下很小:32768到61000改为1024到65000。

在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)another

# 开启恶意icmp错误消息保护

# 开启SYN洪水攻击保护

# 开启并记录欺骗源路由和重定向包

# 确保无人能修改路由表

我要回帖

更多关于 服务器没有tcp端口 的文章

 

随机推荐