发起连接的原理及过程我们的建议文章标题为:TCP建立连接,服务器主动发起连接的原理与过程 (tcp建立连接 服务器主动)

TCP建立连接,服务器主动发起连接的原理与过程

TCP协议是一种传输控制协议,其主要功能是在网络协议栈中提供可靠的数据传输服务。在进行任何数据传输之前,客户端和服务器需要建立连接。在这篇文章中,我们将探讨TCP建立连接的原理和过程,以及建议如何进行建立连接的优化。

TCP建立连接的原理

TCP协议通过三次握手过程来建立连接。在建立连接之前,服务器必须绑定IP地址和端口号并监听客户端发送的连接请求。一旦服务器接收到连接请求,就开始三次握手的过程。

三次握手过程的原理如下:

– 客户端发送一个连接请求报文段,其中包含SYN(同步序列号)字段和一些其他数据。SYN字段包含一个随机的序列号,用于在后续通信中避免数据的重复传输。

– 服务器收到连接请求报文后,发送一个确认报文,其中包含SYN和ACK(确认序列号)字段。服务器在自己的序列号中加入1,并将该序列号放置在ACK中。这个ACK字段的作用是通知客户端服务器接收到了连接请求,并且期望客户端发送确认信息。

– 客户端收到服务器发送的确认报文之后,发送一个确认报文,其中包含ACK字段。此时,客户端在其序列号中增加1,并对服务器的序列号进行确认。一旦服务器收到这个确认报文,TCP连接就被正式建立了。

通过这样的三次握手过程,客户端和服务器就能建立一个可靠的TCP连接。请注意,如果上述任何一个步骤失败,建立连接的过程将失败,需要重新开始整个流程。

TCP建立连接的过程

建立TCP连接的过程包括以下步骤:

1. 客户端发送连接请求

在建立TCP连接之前,客户端必须知道服务器的IP地址和端口号。客户端发送SYN报文段,其中包含客户端序列号和SYN标志。

2. 服务器确认连接请求并发送一个确认报文

服务器收到客户端的连接请求后,必须确认连接。服务器在其确认报文中包含SYN和ACK标志,以及服务器的序列号和客户端的序列号。

3. 客户端确认服务器的确认报文

客户端收到服务器的确认报文,其确认报文中包含服务器的序列号、客户端的序列号和ACK标志。此时,TCP连接已经建立。

建议TCP连接的优化

为了优化TCP连接,可以考虑以下方面:

1. 调整TCP连接的超时时间

在低质量或高延迟网络环境下,TCP连接的超时时间可以被调整。默认的TCP连接超时时间是几秒钟,可以提高或降低此超时时间以适应网络情况。

2. 减少TCP连接的延迟时间

TCP连接的建立和拆除过程可能很消耗时间。避免在连接之间等待,可以使用连接池和连接重用。连接池是一个预分配连接的缓存,可以用于复用以前建立的连接并将它们分配给新的请求。

3. 监控TCP连接

监控TCP连接可以识别性能问题并帮助解决这些问题。例如,可以监控TCP连接的类别、数量和持续时间,以及相关的错误代码和警告。

结论

TCP连接的建立过程可以确保数据传输的可靠性和安全性。三次握手是建立TCP连接的基础,优化TCP连接可以提高网络性能和安全性。我们建议对TCP连接进行优化以提高传输速度和可靠性。在设计和实施TCP连接时,请牢记其原理和过程。

相关问题拓展阅读:

分析tcp协议原理

原理四个主要方面:

一、tcp协议之连接建立、断开

二、tcp协议之超时重传

三、tcp协议之窗口管理

四、tcp协议之拥塞控制

TCP是一种面向有连接的协议,也就是说必须确认对方存在时才能发送数据而TCP通过检验和、序列号、确认应答、重发控制、连接管理、窗口控制等机制来实现可靠传输。

1. 目的:TCP

三次握手

是客户端和服务器总共发三个

数据包

,通过三个数据包来确认主动发送能力和被动接收能力是否正常。

2. 实质:通过指定的四元组(源地址、源端口、目标地址、目标端口)来建立TCP连接,同步双方各自发送序列号seq和确认号ACK,同时也会交换窗口大小信息

三次握手过程的实现方式就是交换序列号seq。

随便在网上找个地址,如果通过域名想看ip地址,可以ping下看连接。

① 192.168.3.7发送报文段至222.169.228.146,告知序列号x为0。

② 222.169.228.146发送报文段至192.168.3.7,告知序列号y为0,确认号ACK为x+1=1。

③192.168.3.7发送报文段至222.169.228.146,告知确认号ACK为y+1=1。

报文段中的其他参数:

MSS=1460

:允许从对方接收到的更大报文段,图中为1460字节(指承载的数据,不包含报文段的头部)。

win=8192

滑动窗口

的大小为8192字节。

SACK_PERM=1

:开启选择确认。为什么会使用SACK:tcp确认方式不是一段报文段一确认,而是采用累积确认方式。服务器接收到的报文段无序所以序列号也是不连续,服务器的接收队列消宽会出现空洞情况。为了解决空洞,提前了解当前空洞,应对丢失遗漏,采取重传。提前了解方式就是通过SACK选迅桥誉项信息,SACK信息包含接收方已经成功接收的数据块的序列号范围。而SACK_PERM字段为1表明,选择开启了SACK功能。

网络层

可能会出现丢失、重复、乱序的问题,tcp是提供可靠的数据传输服务的,为了保证数据的正确性,tcp协议会重传它认为的已经丢失的包。重传两种机制:一种基于时间重传,一种基于确认报文段提供的信息重传。

RTT

:数据完全发送完(完成最后一个比特推送到数据链路上)到收到确认信号的时间(往返时间)。

RTO

:重传超时时间(tcp发送数据时设置一个

计时器

,当计时器超时没有收到数据确认信息,引发超时而重传,判断的标准就是RTO)。

思考:发送序列号为1、2、3、4这4个报文段,但是出现了序列号2报文段丢失,怎么办?

发送端接收到seq1的确认报文(ACK=2)后,等待seq=2的确认报文。

接收端当收到序列号为3的报文(2已丢失),发送ack为4的确认报文,发送亩段端正等待ack为2的确认报文,面对跳跃的报文,那么发送端会一直等待,直到超出指定时间,重传报文2。

为什么不跳跃确认呢?

tcp是累积确认方式,如果确认报文3,那么意味着报文1和报文2都已经成功接收。

超时处理方式:

思考:上面计时器是以时间为标准重传,那么可以通过确认报文的次数来决定重传。

发送端接收到seq1的确认报文(ACK=2)后,等待seq=2的确认报文。

接收端收到报文3、4、5,但是没收到报文2,那么接收端发送三个ACK为2的确认报文,发送端收到这个三个确认报文,重传报文2。

思考:如果快速重传中丢失包的地方很多(报文2,报文,7,报文9,报文30,报文300….),那么需要从头到尾都重传,这很蛋疼?

思考:SACK重传对于接收到重复数据段怎样运作没有明确规定,通过DSACK重传可以让发送方知道哪些数据被重复接收了,而且明确是什么原因造成的。

发送端没有收到的ACK包,超过指定时间,重传报文。

接收端都已经收到的发送报文了,又来是重复报文。再向发送端发送一个ACK报文,设置SACK,告知发送端,已经收到了包,只是回应ACK包丢失。

发送端发送包,由于

网络延迟

,一直没有达到接收端。

接收端连续发送三个ACK 200确认报文,触发快速重传,发送端收到了ACK 500的确认报文,表明之前的报文都已经交付成功。

接收端又收到了延迟的报文,再次向发送端发送一个SACK的ACK 500报文。

发送端发现这是重复报文,判断为网络延迟造成的。

计时器重传:根据超时,重传。

快速重传:根据接收三次相同ACK报文,重传。

选择确认重传:根据接收端提供的SACK信息,重传。

DSACK重传:根据重复报文,明确丢失ACK报文还是网络延迟。

Category1:已发送且已确认(已经收到ACK报文的数据)。

Category2:已发送但未收到确认。

Category3:即将发送。

Category4:窗口移动前都不能发送。

可用窗口:46-51字节。

发送窗口:32-51字节。

RCV.NXT:左边界

RCV.WND:接收窗口

RCV.NXT+RCV.WND:右边界

接收端接收到序列号小于左边界,那么被认为重复数据而被丢弃。

接收端接收到序列号大于右边界,那么被认为超出处理范围,丢弃。

注意:tcp协议为累积ACK结构,只有当达到数据序列号等于左边界时,数据才不会被丢弃。

如果窗口更新ACK丢失,对于发送端,窗口左边界右移,已发送数据得到ACK确认之后,左右边界距离减小,发送端窗口会减小,当左右边界相等时,称为零窗口。零窗口之后:接收端发送窗口更新能会发生窗口更新ACK丢失。

>解释:

TCP是通过接收端的通告窗口来实现

流量控制

的,通告窗口指示了接收端可接收的数据量。

当窗口值变为0时,可以有效阻止发送端继续发送,直到窗口大小恢复为非零值。

当接收端重新获得可用空间时,会给发送端传输一个窗口更新告知其可继续发送数据。这样的窗口更新通常都不包含数据(纯ACK),接收端向发送端发送的窗口更新ACK可能丢失。结果双方处于等待状态,发生

死锁

解决方案:

发送端会采用一个持续计时器间歇性地查询接收端,看其窗口是否已增长。触发窗口探测,强制要求接收端返回ACK。发送几次探测,窗口大小还是0,那么断开连接。

出现SWS的情况:

① 接收端通告窗口太小。

② 发送端发送的数据太小。

解决方案:

① 针对接收端:不应通告小窗口值

描述:在窗口可增至一个全长的报文段(接收端MSS)或者接收端缓存空间的一半(取两者中较小值)之前,不能通告比当前窗口更大的窗口值。标准:min(MSS , 缓存空间/2)。

② 针对发送端:不应发送小的报文

至少满足以下其一:

(1)可以发送MSS字节的报文。

window size >= MSS或者 数据大小>=MSS

(2)数据段长度>=接收端通告过的更大窗口值的一半,才可以发送。

收到之前发送的数据的ack回包,再发送数据,否则一直攒数据。

(3) -1 没有未经确认的在传数据或者-2 连接禁用Nagle算法。

tcp基于ACK数据包中的通告窗口大小字段实现了流量控制。

当网络大规模通信负载而瘫痪,默认网络进入拥塞状态,减缓tcp的传输。发送方和接收方被要求承担超负荷的通信任务时,采取降低发送速率或者最终丢弃部分数据的方法。

反映网络传输能力的变量称为拥塞窗口(cwnd)。

通告窗口(awnd)。

发送窗口swnd=min(cwnd,awnd)

目的:tcp在用拥塞避免算法探寻更多可用带宽之前得到cwnd值,帮助tcp建立ACK时钟。

:在传输初始阶段,由于未知网络传输能力,需要缓慢探测可用传输资源,防止短时间内大量数据注入导致拥塞。慢启动算法针对这一问题而设计。在数据传输之初或者重传计时器检测到丢包后,需要执行慢启动。

拥塞窗口值:每收到一个ACK值,cwnd扩充一倍。所以假设没有丢包且每个数据包都有相应ACK值,在k轮后swnd= ,成

指数增长

SS是发送方的更大段大小。

慢启动阶段,cwnd会指数增长,很快,帮助确立一个慢启动阙值(ssthresh)。有了阙值,tcp会进入拥塞避免阶段,cwnd每次增长值近似于成功传输的数据段大小,成

线性增长

实现公式:cwnd+=SS*SS/cwnd

刚建立连接使用慢启动算法,初始窗口为4,收到一次ACK后,cwnd变为8,再收到一次ACK后,cwnd变为16,依次继续,32、64,达到阙值ssthresh为64。

开始使用拥塞避免算法,设置ssthresh为ssthresh/2,值为32。重新从初始窗口4,线性递增到ssthresh=32。

当cwnd ssthresh时,使用拥塞避免算法

应用快速恢复算法时机:启动快速重传且正常未失序ACK段达到之前。启动快速恢复算法。

实现过程:

① 将ssthresh设置为1/2 cwnd,将cwnd设置为ssthresh+3*SS。

② 每接收一个重复ACK,cwnd值暂时增加1 SS。

③当接收到新数据ACK后,将cwnd设置为ssthresh。

tcp建立连接 服务器主动的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于tcp建立连接 服务器主动,发起连接的原理及过程我们的建议文章标题为:TCP建立连接,服务器主动发起连接的原理与过程,分析tcp协议原理的信息别忘了在本站进行查找喔。


数据运维技术 » 发起连接的原理及过程我们的建议文章标题为:TCP建立连接,服务器主动发起连接的原理与过程 (tcp建立连接 服务器主动)