TCP和UDP详解 (附面试常问问题)

目录

UDP 用户数据报协议

TCP  传输控制协议

TCP首部

TCP连接

TCP如何保证可靠传输

TCP可靠通信的具体实现

TCP如何实现流量控制?

什么是零窗口(接收窗口为0时会怎样)?

TCP的拥塞控制是怎么实现的?

TCP与UDP的区别

什么时候选择TCP,什么时候选UDP?

HTTP可以使用UDP吗?

面向连接和无连接的区别

 


TCP和UDP最基本的责任是:将两个端系统间IP(网络层)的交付服务拓展为运行在端系统上两个进程之间(运输层)的交付服务。

UDP比较简单,咱们先讲UDP

UDP 用户数据报协议

数据交付(复用和分用)、差错检查是最低限度的运输层服务,也是UDP能提供的仅有的两种服务。所以UDP只在IP数据报上增加了很少的一点功能。

UDP的特点:

1、UDP是无连接的。(不需要建立连接)

2、UDP尽最大努力交付。(不保证可靠交付)

3、UDP是面向报文的。(它不拆分也不合并报文,直接加个UDP首部就往下传送,一次交付一个完整的报文。)

4、UDP没有拥塞控制。(适合多媒体通信)

5、UDP支持一对一、一对多、多对一和多对多的交互通信。(因为不需要连接)

6、UDP首部开销小,8个字节,而TCP需要20个字节的首部。(服务少,存储的信息就少)

伪首部:并不是UDP真正的首部,唯一的用途就是计算检验和。在计算检验和时,临时添加在UDP数据报前的,不向下传也不上交,所以叫伪首部。

源端口:发货地,防止出现别人要退货的情况。

【如果接收方UDP发现收到的报文目的端口号不正确,就丢弃报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送放】

目的端口:收货地

长度:UDP用户数据报的长度,min=8(只有首部,没有数据的情况)

检验和:检测UDP用户数据报在传输过程中有没有出错

为什么UDP要提供差错检查呢?(当然,这里的UDP可以改成运输层蛤,UDP是运输层的一个代表)

因为UDP不能保证源和目的之间的所有链路都提供差错检查,本着主人翁的心态,UDP就想着:唉,我自己上吧。

在既无法保证链路可靠性,又无法确保内存中差错检查的情况下,端对端数据传输要提供差错检查。这就是“端到端原则”。

像极了考试算出答案心里没底,反复检查的弱鸡的我~

TCP复杂很多,咱们慢慢讲~

TCP  传输控制协议

TCP的特点:

1、TCP是面向连接的。(连接是一条虚连接(逻辑连接)而不是一条真正的物理连接。)

2、TCP是点对点的,既一对一的。

3、TCP提供可靠服务。通过TCP连接传送的数据,无差错,不丢失,不重复,按序到达

4、TCP提供全双工信道。通信双方任何适合都能发送数据

5、TCP面向字节流(根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节,可把太长的数据块划分短一些再传送,也可等待积累有足够多的字节后再构成报文段发送出去

TCP首部

源端口和目的端口:发货地和送货地,各占两个字节

序号:TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 
确认号:是期望收到对方的下一个报文段的数据的第一个字节的序号。 (若确认号为N,则表明包括序号N-1在内的所有数据已正确收到)
数据偏移: TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。(即首部长度,因为”选项“和”填充“长度不知)“数据偏移”的单位是 32 位字(以 4 字节为计算单位)最大为60字节,也就是说TCP首部min=20字节 max=60字节。 
保留字段:未雨绸缪,保留为今后使用,但目前应置为 0。

URG:紧急! 当URG=1时,表明紧急指针字段有效,需要尽快处理(高优先级)。这时TCP会把紧急数据插入到数据最前面。

ACK:确认。ACK=0时,确认号无效,ACK=1时确认号字段才有效。

PUSH:推送。接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。  

RST:复位。当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 

SYN:同步。SYN = 1而ACK=0时,表示这是一个连接请求。若同意建立连接,则需要在响应报文中置SYN=1,ACK=1。

FIN:终止。用来释放一个连接。FIN =1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。 

窗口:指的是发送本报文段的一方的接收窗口(A:给你一些东西,顺便告诉你:我能接收这么大的数据量),让对方(接收一方B,他需要发送数据过去,)设置发送窗口的依据。窗口明确指出了现在允许的对方的数据发送量,并动态变化着。

检验和 :检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

紧急指针:指出在本报文段中紧急数据共有多少个字节

TCP连接

TCP是面向连接的,每一条 TCP 连接有两个端点

TCP 连接的端点叫做套接字 (socket) 。
端口号拼接到 IP 地址即构成了套接字:socket = (IP地址 : 端口号)               

每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP 连接 ::= {socket1, socket2}   = {(IP1: port1),(IP2: port2)}

TCP 连接,IP 地址,端口号

  • 同一个 IP 地址可以有多个不同的 TCP 连接。
  • 同一个端口号也可以出现在多个不同的 TCP 连接中。

 

TCP如何保证可靠传输

  1. 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据。
  2. 对失序数据包重新排序(TCP报文具有序列号):TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
  3. 丢弃重复数据:对于重复数据,能够丢弃重复数据;
  4. 应答机制:接收方收到数据之后,会发送一个确认(通常延迟几分之一秒);
  5. 超时重发:发送方发出数据之后,启动一个定时器,超时未收到接收方的确认,则重新发送这个数据;
  6. 流量控制:确保接收端能够接收发送方的数据而不会缓冲区溢出,TCP使用的流量控制协议是可变大小的滑动窗口协议。

 

TCP可靠通信的具体实现

TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口
TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。
TCP 两端的四个窗口经常处于动态变化之中。
TCP连接的往返时间 RTT 也不是固定不变的。需要使用特定的算法估算较为合理的重传时间

TCP如何实现流量控制?

流量控制:让发送方的发送速率不要太快,要让接收方来得及接收。

使用滑动窗口协议实现流量控制。防止发送方发送速率太快,接收方缓存区不够导致溢出。

接收方会维护一个接收窗口 receiver window(窗口大小单位是字节),接收窗口的大小是根据自己的资源情况动态调整的,在返回ACK时将接受窗口大小放在TCP报文中的窗口字段告知发送方。发送窗口的大小不能超过接受窗口的大小,只有当发送方发送并收到确认之后,才能将发送窗口右移。

发送窗口的上限为接受窗口和拥塞窗口中的较小值。接受窗口表明了接收方的接收能力,拥塞窗口表明了网络的传送能力。

什么是零窗口(接收窗口为0时会怎样)?

如果接收方没有能力接收数据,就会将接收窗口设置为0,这时发送方必须暂停发送数据,但是会启动一个持续计时器(persistence timer),到期后发送一个大小为1字节的探测数据包,以查看接收窗口状态。如果接收方能够接收数据,就会在返回的报文中更新接收窗口大小,恢复数据传送。

TCP的拥塞控制是怎么实现的?

拥塞:在某段时间里,对网络中某一资源的需求超过了该资源所能提供的可用部分,导致网络性能变坏。

拥塞控制:防止过多数据注入到网络中,防止网络中的路由器或链路过载。

下面就是一个TCP拥塞控制的方法:

TCP的拥塞控制主要由四个算法组成:慢开始(Slow Start)、拥塞避免(Congestion voidance)、快重传 (Fast Retransmit)、快恢复(Fast Recovery)

首先,发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,窗口就可以再大一些。而判断有没有出现拥塞的方法就是是否出现超时。

1、慢开始:用小到大逐渐增大发送窗口。刚开始发送数据时,先把拥塞窗口(congestion window)设置为一个最大报文段MSS的数值,每收到一个新的确认报文之后,就把拥塞窗口加1个MSS。这样每经过一个传输轮次(或者说是每经过一个往返时间RTT),拥塞窗口的大小就会加倍

2、拥塞避免:当拥塞窗口的大小达到慢开始门限(slow start threshold)时,开始执行拥塞避免算法,拥塞窗口大小不再指数增加,而是线性增加,即每经过一个传输轮次只增加1MSS.

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。(这是不使用快重传的情况)

      3、快重传:让发送方尽早知道发生了个别报文段的丢失。快重传要求接收方在收到一个失序的报文段后就立即发出重复确认而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

     4、快恢复:当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。

          不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞。
 

TCP与UDP的区别

  1. TCP是面向连接的,UDP是无连接的;
  2. TCP是可靠的,UDP不可靠;
  3. TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多;
  4. TCP是面向字节流的,UDP是面向报文的;
  5. TCP有拥塞控制机制,UDP没有。
  6. TCP首部开销(20字节)比UDP首部开销(8字节)要大

什么时候选择TCP,什么时候选UDP?

展开对某些实时性要求比较高的情况,选择UDP,比如游戏,媒体通信,实时视频流(直播),即使出现传输错误也可以容忍;其它大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不出现丢失。

HTTP可以使用UDP吗?

HTTP不可以使用UDP,HTTP需要基于可靠的传输协议,而UDP不可靠。

面向连接和无连接的区别

无连接的网络服务(数据报服务)-- 面向连接的网络服务(虚电路服务)

虚电路服务:首先建立连接,所有的数据包经过相同的路径,服务质量有较好的保证;

数据报服务:每个数据包含目的地址,数据路由相互独立(路径可能变化);网络尽最大努力交付数据,但不保证不丢失、不保证先后顺序、不保证在时限内交付;网络发生拥塞时,可能会将一些分组丢弃;

 

发布了38 篇原创文章 · 获赞 6 · 访问量 1894

猜你喜欢

转载自blog.csdn.net/weixin_43827227/article/details/105023037