程序员面试必考题(十八)--TCP的拥塞控制机制
TCP拥塞控制四个主要过程

TCP 拥塞控制四个主要过程1 / 1 TCP 拥塞控制四个主要过程(如图(a )和(b )所示)简要介绍如下:图(a ):慢启动和拥塞避免 图(b ):快速重传和快速恢复1. 慢启动阶段:早期开发的TCP 应用在启动一个连接时会向网络中发送大量的数据包,这样很容易导致路由器缓存空间耗尽,网络发生拥塞,使得TCP 连接的吞吐量急剧下降。
由于TCP 源端无法知道网络资源当前的利用状况,因此新建立的TCP 连接不能一开始就发送大量数据,而只能逐步增加每次发送的数据量,以避免上述现象的发生。
具体地说,当建立新的TCP 连接时,拥塞窗口(congestion window ,cwnd )初始化为一个数据包大小。
源端按cwnd 大小发送数据,每收到一个ACK 确认,cwnd 就增加一个数据包发送量,这样cwnd 就将随着回路响应时间(Round Trip Time ,RTT )呈指数增长,源端向网络发送的数据量将急剧增加。
事实上,慢启动一点也不慢,要达到每RTT 发送W 个数据包所需时间仅为RTT×logW 。
由于在发生拥塞时,拥塞窗口会减半或降到1,因此慢启动确保了源端的发送速率最多是链路带宽的两倍。
2. 拥塞避免阶段:如果TCP 源端发现超时或收到3个相同ACK 副本时,即认为网络发生了拥塞(主要因为由传输引起的数据包损坏和丢失的概率很小(<<1%))。
此时就进入拥塞避免阶段。
慢启动阈值(ssthresh )被设置为当前拥塞窗口大小的一半;如果超时,拥塞窗口被置1。
如果cwnd>ssthresh ,TCP 就执行拥塞避免算法,此时,cwnd 在每次收到一个ACK 时只增加1/cwnd 个数据包,这样,在一个RTT 内,cwnd 将增加1,所以在拥塞避免阶段,cwnd 不是呈指数增长,而是线性增长。
3. 快速重传和快速恢复阶段:快速重传是当TCP 源端收到到三个相同的ACK 副本时,即认为有数据包丢失,则源端重传丢失的数据包,而不必等待RTO 超时。
TCP,UDP,Socket,Http网络编程面试题 47道

TCP/IP参考模型TCP/IP四层协议(数据链路层、网络层、传输层、应用层)1. 应用层应用层最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。
我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,TELNET等。
2. 传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。
该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。
我们通常说的,TCP UDP就是在这一层。
端口号既是这里的“端”。
3. 网络层本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。
就是通常说的IP层。
这一层就是我们经常说的IP协议层。
IP协议是Internet的基础。
4. 数据链路层通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。
实现这些规程或协议的硬件和软件加到物理线路,这样就构成了数据链路,1 TCP / UDP1. 第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;2. 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态;3. 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
tcpip面试题

tcpip面试题TCP/IP面试题一、TCP/IP协议简介TCP/IP协议是互联网的核心协议之一,它是一个包含多个协议的网络通信协议簇。
在面试中,经常会涉及到TCP/IP协议的相关问题。
下面是一些常见的TCP/IP面试题及其解答。
二、TCP/IP协议的四层模型1.请简要介绍TCP/IP协议的四层模型。
TCP/IP协议的四层模型由网络接口层、网络层、传输层和应用层组成。
其中,网络接口层负责将数据转化为以太网帧进行传输;网络层负责路由和寻址;传输层负责可靠的数据传输;应用层负责具体的应用程序。
三、TCP/IP协议的三次握手2.请解释TCP/IP协议的三次握手过程。
三次握手是建立TCP连接的过程。
首先,客户端向服务器发送一个SYN包,表示请求建立连接;然后服务器收到SYN包后,回复一个SYN/ACK包给客户端,表示同意建立连接;最后,客户端再向服务器发送一个ACK包,表示确认连接建立。
这样,TCP连接就建立起来了。
四、TCP/IP协议的滑动窗口3.请简要介绍TCP/IP协议的滑动窗口机制。
滑动窗口是一种流量控制和拥塞控制的机制。
发送方和接收方通过协商窗口大小来控制数据的发送和接收速率。
在发送方接收到接收方的确认时,窗口向前滑动,可发送的数据量增加;在发送方发送数据时,窗口向后滑动,可发送的数据量减少。
通过这种方式,发送方和接收方能够根据网络情况自动调节数据传输的速率。
五、TCP/IP协议的重传机制4.请解释TCP/IP协议的重传机制。
TCP/IP协议使用了超时重传机制来保证数据的可靠传输。
当发送方发送数据后,如果在一定时间内没有收到接收方的确认,发送方会重新发送这些数据。
而且,接收方在接收到重复的数据时,会丢弃重复的数据。
通过重传机制,TCP/IP协议能够保证数据的可靠传输。
六、TCP/IP协议的拥塞控制5.请简要介绍TCP/IP协议的拥塞控制机制。
拥塞控制是一种网络流量控制的机制,用于防止网络的拥塞。
计网面试题——精选推荐

计⽹⾯试题(1)建⽴TCP服务器的各个系统调⽤建⽴TCP服务器连接的过程中主要通过以下系统调⽤序列来获取某些函数,这些系统调⽤主要包括:socket(),bind(),listen(),accept(),send()和recv()。
详见:(2)继上⼀题,说明socket⽹络编程有哪些系统调⽤?其中close是⼀次就能直接关闭的吗,半关闭状态是怎么产⽣的?1 2 3 4 5 6 7 8socket() 创建套接字bind() 绑定本机端⼝connect() 建⽴连接(TCP三次握⼿在调⽤这个函数时进⾏)listen() 监听端⼝accept() 接受连接recv(), read(), recvfrom() 数据接收send(), write(), sendto() 数据发送close(), shutdown() 关闭套接字使⽤close()时,只有当套接字的引⽤计数为0的时候才会终⽌连接,⽽⽤shutdown()就可以直接关闭连接详见:TCP连接与断开详解:(3)对路由协议的了解与介绍。
内部⽹关协议IGP包括RIP,OSPF,和外部⽹关协议EGP和BGP.RIP“路由信息协议(Route Information col)”的简写,主要传递路由信息,通过每隔30秒⼴播⼀次路由表,维护相邻路由器的位置关系,同时根据收到的路由表信息使⽤的⽅式计算⾃⼰的路由表信息。
RIP是⼀个距离⽮量路由协议,最⼤跳数为16跳,16跳以及超过16跳的⽹络则认为⽬标⽹络不可达。
OSPF:详见:(4) UDP如何实现可靠传输因为UDP是⽆连接的协议,所以在传输层上⽆法保证可靠传输,要想实现可靠传输,只能从应⽤层实现。
需要实现seq/ack机制,重传机制和窗⼝确认机制。
就要接收⽅收到UDP之后回复个确认包,发送⽅有个机制,收不到确认包就要重新发送,每个包有递增的序号,接收⽅发现中间丢了包就要发重传请求,当⽹络太差时候频繁丢包,防⽌越丢包越重传的恶性循环,要有个发送窗⼝的限制,发送窗⼝的⼤⼩根据⽹络传输情况调整,调整要有⼀定⾃适应性。
计算机面试常问问题_计算机岗位面试题

计算机面试常问问题_计算机岗位面试题计算机面试常问问题一1、TCP为什么需要3次握手,4次断开?“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。
本来这是一个早已失效的报文段。
但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。
于是就向client发出确认报文段,同意建立连接。
假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。
由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。
但server却以为新的运输连接已经建立,并一直等待client发来数据。
这样,server的很多资源就白白浪费掉了。
采用“三次握手”的办法可以防止上述现象发生。
例如刚才那种情况,client不会向server的确认发出确认。
server 由于收不到确认,就知道client并没有要求建立连接。
”。
主要目的防止server端一直等待,浪费资源。
为什么4次断开?因为TCP有个半关闭状态,假设A.B要释放连接,那么A 发送一个释放连接报文给B,B收到后发送确认,这个时候A 不发数据,但是B如果发数据A还是要接受,这叫半关闭。
然后B还要发给A连接释放报文,然后A发确认,所以是4次。
在tcp连接握手时为何ACK是和SYN一起发送,这里ACK 却没有和FIN一起发送呢。
原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。
2、TCP和UDP有什么区别?TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。
通信双方彼此交换数据前,必须先通过三次握手协议建立连接,之后才能传输数据。
TCP提供超时重传,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
tcp使用的阻塞控制机制

tcp使用的阻塞控制机制
TCP使用的阻塞控制机制主要有以下几种:
1.慢启动(Slow Start):这是TCP使用的一种阻塞控制机制,也被称为指数增长期。
在慢启动阶段,TCP每次收到接收窗口的确认时,都会增加已确认段的数目,这种情况一直持续到要么没有新的段收到,要么窗口大小达到预先定义的阈值。
如果发生丢失事件,TCP 就认为这是网络阻塞,就会采取措施减轻网络拥挤。
一旦发生丢失事件或者到达阈值,TCP就会进入线性增长阶段。
2.拥塞控制(Congestion Control):当网络出现拥塞时,TCP 会减少发送的数据量,以避免网络拥塞进一步恶化。
具体来说,当TCP发现网络出现拥塞时,它会将窗口大小减小到1个段,并开始执行“慢启动”算法。
3.快重传(Fast Retransmit):当TCP收到3个以上的相同确认时,就认为数据段丢失了,这时TCP会立即重传丢失的数据段,而不必等待定时器的超时。
4.快恢复(Fast Recovery):在发生数据段丢失后,TCP会立即执行快恢复算法,重新设定拥塞窗口大小,并开始执行“快重传”算法。
这些是TCP主要的阻塞控制机制。
TCPIP详解学习笔记(15)--TCP的流量控制和拥塞控制

TCPIP详解学习笔记(15)--TCP的流量控制和拥塞控制TCP的流量控制1.概述所谓的流量控制就是让发送⽅的发送速率不要太快,让接收⽅来得及接受。
利⽤滑动窗⼝机制可以很⽅便的在TCP连接上实现对发送⽅的流量控制。
TCP的窗⼝单位是字节,不是报⽂段,发送⽅的发送窗⼝不能超过接收⽅给出的接收窗⼝的数值。
如图所⽰,说明了利⽤可变窗⼝⼤⼩进⾏流量控制。
设主机A向主机B发送数据。
双⽅确定的窗⼝值是400.再设每⼀个报⽂段为100字节长,序号的初始值为seq=1,图中的箭头上⾯⼤写ACK,表⽰⾸部中的却认为为ACK,⼩写ack表⽰确认字段的值。
接收⽅的主机B进⾏了三次流量控制。
第⼀次把窗⼝设置为rwind=300,第⼆次减⼩到rwind=100最后减到rwind=0,即不允许发送⽅再发送过数据了。
这种使发送⽅暂停发送的状态将持续到主机B重新发出⼀个新的窗⼝值为⽌。
假如,B向A发送了零窗⼝的报⽂段后不久,B的接收缓存⼜有了⼀些存储空间。
于是B向A发送了rwind=400的报⽂段,然⽽这个报⽂段在传送中丢失了。
A⼀直等待收到B发送的⾮零窗⼝的通知,⽽B也⼀直等待A发送的数据。
这样就死锁了。
为了解决这种死锁状态,TCP为每个连接设有⼀个持续计时器。
只要TCP连接的⼀⽅收到对⽅的零窗⼝通知,就启动持续计时器,若持续计时器设置的时间到期,就发送⼀个零窗⼝探测报⽂段(仅携带1字节的数据),⽽对⽅就在确认这个探测报⽂段时给出了现在的窗⼝值。
2.TCP报⽂段发送时机的选择TCP豹纹短短发送时机主要有以下⼏种选择途径。
1)TCP维持⼀个变量,它等于最⼤报⽂段长度MSS,只要缓存中存放的数据达到MSS字节就组装成⼀个TCP报⽂段发送出去。
2)由发送⽅的应⽤程序指明要求发送报⽂段,即TCP⽀持的推送操作3)是发送⽅的⼀个计时器期限到了,这时就把当前已有的缓存数据装⼊报⽂段发送出去。
TCP的拥塞控制1.拥塞控制的原理在某段时间,若对⽹络中的某⼀资源的需求超过了该资源所能提供的可⽤部分,⽹络的性能就要变化,这种情况叫做拥塞。
tcp ip协议面试题

tcp ip协议面试题TCP/IP协议面试题TCP/IP协议是互联网中最重要的协议之一,广泛应用于网络通信和数据传输。
在进行TCP/IP协议面试时,以下是一些常见的问题及其答案,希望对您的面试准备有所帮助。
问题一:什么是TCP/IP协议?请简要介绍一下TCP/IP协议的基本原理。
答:TCP/IP(Transmission Control Protocol / Internet Protocol)是一组用于互联网通信的协议,分为两个部分:TCP负责数据的可靠传输,IP负责数据的传输和路由。
TCP采用面向连接的方式进行数据传输,通过三次握手确保数据可靠性。
发送端首先发送一个SYN数据包给接收端,接收端收到后回复一个SYN-ACK数据包,最后发送端发送一个ACK数据包进行确认。
成功建立连接后,数据通过序列号和确认号进行可靠传输。
IP是一种无连接的协议,负责将数据分组(数据包)从源主机发送到目标主机。
IP将数据包封装成数据报,其中包含源IP地址和目标IP地址。
路由器根据IP地址将数据报传输到下一个节点,直到到达目标主机。
问题二:TCP和UDP之间有什么区别,它们各自适用于哪些场景?答:TCP和UDP是TCP/IP协议族中的两个重要协议。
TCP(Transmission Control Protocol)是一种面向连接的可靠传输协议,保证数据的完整性和顺序性。
TCP提供拥塞控制和流量控制,适用于要求数据可靠性的场景,如网页浏览、电子邮件和文件传输等。
UDP(User Datagram Protocol)是一种面向非连接的传输协议,不保证数据的可靠性。
UDP具有较低的开销和较快的传输速度。
UDP适用于对实时性要求较高的场景,如音频和视频流传输,DNS查询等。
问题三:请说明TCP的三次握手和四次挥手过程。
答:TCP通过三次握手建立连接,四次挥手断开连接。
三次握手过程:1. 第一次握手:客户端发送一个SYN数据包给服务器,并将序列号初始化为一个随机值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拥塞控制(congestion control)是TCP协议的一项重要功能,TCP
的拥塞控制机制是从端到端的角度,推测网络是否发生拥塞,如果推断网络发生拥塞,则立即将数据发送速率降下来,以便缓解网络拥塞。
TCP的拥塞控制采用的是窗口机制,通过调节窗口的大小实现对数据发送速率的调整。
TCP的发送端维持一个称为拥塞窗口cwnd的变量,单位为字节,用于表示在未收到接收端确认的情况下,可以连续发送的数据字节数。
cwnd的大小取决于网络的拥塞程度,并且动态地发生变化。
拥塞窗口调整的原则是:只要网络没有出现拥塞,就可以增大拥塞窗口,以便将更多的数据发送出去,相当于提高发送速率;一旦网络出现拥塞,拥塞窗口就减小一些,减少注入网络的数据量,从而缓解网络的拥塞。
发送端判断网络发生拥塞的依据是:发送端设置一个重传计时器RTO,对于某个已发出的数据报文段,如果在RTO计时到期后,还没有收到来自接收端的确认,则认为此时网络发生了拥塞。
TCP的拥塞控制算法包括了慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)四部分。
慢启动算法作用在TCP数据传输的开始阶段,当主机开始发送数据时,因为不知道网络中的负荷情况,如果立即发送大量的数据,有可能会引起网络的拥塞。
因此,TCP采用试探的方法,逐渐增大拥塞窗
口。
通常在刚开始发送数据报文段时,先将拥塞窗口cwnd设置为一个TCP最大段长度MSS的值。
而在每收到一个数据报文段的确认后,cwnd就增加一个MSS的数值。
这样就可以逐渐增大发送端的拥塞窗口,使数据注入网络的速率比较合理。
如果定义从发送端发出一个数据报文段到收到这个数据报文段的确认的时间间隔为往返时间RTT,则在慢启动阶段,每经过一个RTT,cwnd的值就加倍。
为了防止拥塞窗口增长过快而引起网络拥塞,TCP还需要设置一个慢启动阈值ssthresh,当拥塞窗口的值增加到ssthresh时,就要减缓拥塞窗口的增长速度,具体的做法是每经过一个RTT,拥塞窗口cwnd 的值加1(单位为MSS),这样就可以使cwnd按线性规律缓慢增长,这个过程称之为“加性增加”(Additive Increase)算法。
通常情况下,拥塞窗口cwnd的初值被设置为1,慢启动阈值ssthresh的初值被设置为16。
当拥塞避免算法执行到某个时刻,发送端在规定时间内没有收到接收端的确认,即发生了网络超时,则意味着网络发生了拥塞。
此时,发送端首先将ssthresh的值变为发生超时时cwnd值的一半,同时将cwnd的值置为1,重新执行慢启动算法。
这样做的好处是,当网络频繁出现拥塞时,ssthresh下降得很快,可以大大减少注入网络中的数据报文段。
通常称这个过程为“乘性减小”(MultiplicativeDecrease)算法。
TCP中的“加性增加”和“乘性减小”算法合起来称为AIMD算法。
慢启动和拥塞避免是1988年提出的拥塞控制算法,1990年在此基础上又增加了快速重传和快速恢复两个算法。
快速重传算法的基本思想是:接收端每收到一个失序的数据报文段后就立即发出重复确认,以便更早地通知发送端有丢包的情况发生。
假设在某个TCP数据传输过程中,接收端依次收到发送端发出的1号和2号数据报文段,并对这两个数据报文段发送确认后,没有按次序收到3号数据报文段,而是收到了4号,这时就需要立即向发送端发送一个2号数据报文段的确认,称为重复确认。
同理,如果继续收到5号、6号数据报文段,接收端仍然要向发送端发出2号数据报文段的重复确认。
此时,发送端会收到多个2号数据报文段的重复确认,则认为3号数据报文段发生了丢包,需要立即向接收端重传3号数据报文段,而不需要等待重传计时器到期再重传。
快速重传算法中规定如果收到某数据报文段的三个重复确认,则立即重传下一个数据报文段。
快速恢复是配合快速重传使用的算法,其基本思想是:当发送端连续收到三个重复确认时,就将慢启动阈值ssthresh减半,以预防网络拥塞的发生,并且将拥塞窗口cwnd的值置为减半后的ssthresh,然后开始执行拥塞避免算法,使得cwnd缓慢地加性增大。
TCP拥塞控制算法描述如下:
SlowStartPhase( ) //慢启动算法
{
CongWin=1; //拥塞窗口cwnd的初值为1个MSS
while (CongWin<Threshold&& 无数据丢失)
//当拥塞窗口小于慢启动阈值且没有发生丢包时
{
for each ACK
CongWin++; //每收到一个确认数据报,拥塞窗口加1
}
if (CongWin>=Threshold) then CongestionAvoidancePhase( );
//当拥塞窗口大于等于慢启动阈值时,启动拥塞避免算法;if (数据丢失) then
DataLoss( ); // 丢包后的处理方法
}
CongestionAvoidancePhase( ) // 拥塞避免算法
{
while (无数据丢失)
{
for each RTT
CongWin=CongWin+1; //每经过一个RTT,拥塞窗口加1
}
DataLoss( );
}
DataLoss( ) //丢包后的处理方法
{
if (超时) then
{
Threshold=CongWin/2;
CongWin=1;
SlowStartPhase( );
//如果发生超时,慢启动阈值置为当前拥塞窗口的一半,然后将拥塞窗口置1,开始执行拥塞避免算法。
}
if (3次重复确认) then
{
Threshold=CongWin/2;
CongWin=CongWin/2;
CongestionAvoidancePhase();
//如果收到3个重复的确认,则执行快速重传和快速恢复算法,慢启动阈值减小为拥塞窗口的一半,同时将拥塞窗口减半,开始拥塞避免算法
以上内容由北大青鸟佳音校区老师于网络整理,学计算机课程选择北大青鸟佳音校区!。