简述tcp协议工作原理

简述tcp协议工作原理,第1张

您的问题我已看到,那么,简述tcp协议工作原理??下面就由小编来为您解答。

答:1.在源主机上,应用层将一串应用数据流传送给传输层。

2.传输层将应用层的数据流截成分组,并加上TCP报头形成TCP段,送交网络层。

3.在网络层给TCP段加上包括源、目的主机IP地址的IP报头,生成一个IP数据包,并将IP数据包送交链路层。

4.链路层在其MAC帧的数据部分装上IP数据包,再加上源、目的主机备兆的MAC地址和帧头,并根据其目的MAC地址,将MAC帧发往目的主机或IP路由器。

5.在目的主机,链路层将MAC帧的帧头去掉,并将IP数据包送交网络层。

6.网络层检余凯查IP报头,如果报头中校验和与计算结果不一致,则丢弃该IP数据包;若校验和与计算结果一致,则去掉IP报头,将TCP段送交传输层。

7.传输层检查顺序号,判断是否是正确的TCP分组,然后检查TCP报头数据。若正确,则向源主机发确认信息;若不正确或丢包,则向源主机要求重发信息。

8.在目的主机,传输层去掉TCP报头,将排好顺序的分组竖滚唤组成应用数据流送给应用程序。这样目的主机接收到的来自源主机的字节流,就像是直接接收来自源主机的字节流一样。

以上仅供您参考,还望您能采纳,谢谢!

原理四个主要方面:

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

二、tcp协议之超时重传

三、tcp协议之窗口管理

四、tcp协议之拥塞控制

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

1. 目的:TCP三次握手是客户端和服务器总共发三个数据包,通过三个数据包来确认主动发送能力和被动接收能力是否正常。

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

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

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

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

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

③192.168.3.7发送[ACK]报文段至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重传可以让发送方知道哪些数据被重复接收了,而且明确是什么原因造成的。

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

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

发送端发送包100-199,由于网络延迟,一直没有达到接收端。

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

接收端又收到了延迟的报文100-199,再次向发送端发送一个SACK 100-199的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/ip 详解>>解释:

TCP是通过接收端的通告窗口来实现流量控制的,通告窗口指示了接收端可接收的数据量。

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

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

解决方案:

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

出现SWS的情况:

① 接收端通告窗口太小。

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

解决方案:

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

[RFC1122]描述:在窗口可增至一个全长的报文段(接收端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时钟。

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

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

SMSS是发送方的最大段大小。

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

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

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

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

当cwnd <ssthresh时,使用慢启动算法

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

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

实现过程:

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

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

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

参考:<<tcp/ip 详解>>

一个数据包的生命过程:数据包如何送达主机、主机如何将数据包转交给应用、数据是如何被完整地送达应用程序

互联网,实际上是一套理念和协议组成的体系架构 。其中,协议是一套众所周知的规则和标准,如果各方都同意使用,那么它们之间的通信将变得毫无障碍。数据通信是通过数据包来传输的。如果发送的数据很大,那么该数据就会被拆分为很多小数据包来传输。之后再由接收方按照数据包中的一定规则将小的数据包整合成全部数据。

IP 是非常底层的协议,只负责把数据包传送到对方电脑,不负责该数据包将由哪个程序去使用。

数据包要在互联网上进行传输,就要符合网际协议(Internet Protocol,简称 IP)标准。计算机的地址就称为 IP 地址,访问任何网站实际上只是你的计算机向另外一台计算机请求信息。

简单理解数据传输过程就是:装包和拆包。 如果要想把一个数据包从主机 A 发送给主机 B,那么在传输之前,数据包上会被附加上主机 B 的 IP 地址信息,这样在传输过程中才能正确寻址。额外地,数据包上还会附加上主机 A 本身的 IP 地址,有了这些信息主机 B 才可以回复信息给主机 A。这些附加的信息会被装进一个叫 IP 头的数据结构里。IP 头是 IP 数据包开头的信息,包含 IP 版本、源 IP 地址、目标 IP 地址、生存时间等信息。

过程:

1、上层将含有“数据”的数据包交给网络层;

2、网络层再将 IP 头附加到数据包上,组成新的 IP 数据包,并交给底层;

3、底层通过物理网络将数据包传输给主机 B;

4、数据包被传输到主机 B 的网旦姿首络层,在这里主机 B 拆开数据包的 IP 头信息,并将拆开来的数据部分交给上层;

5、最终,含有“数据”信息的数据包就到达了主机 B 的上层了。

基于 IP 之上开发能和应用打交道的协议,最常见的是“用户数据包协议(User Datagram Protocol)”,简称 UDP。负责将传输的数据包交给某一应用程序。

UDP 中一个最重要的信息是端口号,端口号其实就是一个数字,每个想访问网络的程序都需要绑定一个端口号。通过端口号 UDP 就能把指定的数据包发送给指定的程序了, 所以 IP 通过 IP 地址信息把数据包发送给指定的电脑,而 UDP 通过端口号把册御数据包分发给正确的程序。 和 IP 头一样,端口号会被装进 UDP 头里面,UDP 头再和原始数据包合并组成新的 UDP 数据包。UDP 头中除了目的端口,还有源端口号等信息。

为了支持 UDP 协议,我把前面的三层结构扩充为四层结构,在网络层和上层之间增加了传输层

过程:

1、 上层将数据包交给传输层;传输层会在数据包前面附加上 UDP 头,组成新的 UDP 数据包,再将新的 UDP 数据包交给网络层;

2、网络层再将 IP 头附加到数据包上,组成新的 IP 数据包,并交给底层;

3、数据包被传输到主机 B 的网络层,在这里主机 B 拆开 IP 头信息,并将拆开来的数据部分交给传输层;

4、在传输层,数据包中的 UDP 头会被拆开,并根据 UDP 中所提供的端口号,把数据部分交给上层的应用程序;

5、最终,含有信息的数据包就旅行到了主机 B 上层应用程序这里。

在使用 UDP 发模数送数据时,有各种因素会导致数据包出错,虽然 UDP 可以校验数据是否正确,但是对于错误的数据包, UDP 并不提供重发机制,只是丢弃当前的包 ,而且 UDP 在发送之后也无法知道是否能达到目的地。虽说 UDP 不能保证数据可靠性,但是传输速度却非常快 ,所以 UDP 会应用在一些关注速度、但不那么严格要求数据完整性的领域,如在线视频、互动游戏等

上文说到的使用 UDP 来传输会存在两个问题 :

1、数据包在传输过程中容易丢失;

2、大文件会被拆分成很多小的数据包来传输,这些小的数据包会经过不同的路由,并在不同的时间到达接收端,而 UDP 协议并不知道如何组装这些数据包,从而把这些数据包还原成完整的文件。

所以TCP协议很好地解决的这个问题。

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

1、对于数据包丢失的情况,TCP 提供重传机制;

2、TCP 引入了数据包排序机制,用来保证把乱序的数据包组合成一个完整的文件。

和 UDP 头一样,TCP 头除了包含了目标端口和本机端口号外,还提供了 用于排序的序列号 ,以便接收端通过序号来重排数据包

一个完整的 TCP 连接的生命周期包括了“建立连接”“传输数据”和“断开连接”三个阶段。

首先,建立连接阶段。这个阶段是通过“三次握手”来建立客户端和服务器之间的连接。TCP 提供面向连接的通信传输。面向连接是指在数据通信开始之前先做好两端之间的准备工作。所谓 三次握手 ,是指在建立一个 TCP 连接时,客户端和服务器总共要发送三个数据包以确认连接的建立。

其次,传输数据阶段。在该阶段,接收端需要对每个数据包进行确认 *** 作,也就是接收端在接收到数据包之后,需要发送确认数据包给发送端。所以当发送端发送了一个数据包之后,在规定时间内没有接收到接收端反馈的确认消息,则判断为数据包丢失,并触发发送端的重发机制。同样,一个大的文件在传输过程中会被拆分成很多小的数据包,这些数据包到达接收端后,接收端会按照 TCP 头中的序号为其排序,从而保证组成完整的数据。

最后,断开连接阶段。数据传输完毕之后,就要终止连接了,涉及到最后一个阶段“ 四次挥手 ”来保证双方都能断开连接。

三次握手和四次挥手限于篇幅可看另一篇文章: TCP协议中 的三次握手和四次挥手

1、IP 负责把数据包送达目的主机。

2、UDP 负责把数据包送达具体应用(可能会丢包)。

3、而 TCP 保证了数据完整地传输 ,它的连接可分为三个阶段:建立连接、传输数据和断开连接。

完整的数据流程


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12336781.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存