TCP/UDP协议介绍


TCP协议

1.TCP协议的主要特点

  1. TCP是面向连接的传输层协议,使用前需建立连接,使用后需释放连接
  2. 每一条TCP连接只能有两个端点,也就是说TCP连接只能是一对一
  3. TCP能提供可靠交互的服务.也就是说使用TCP协议连接传输的数据:无差错,不丢失,不重复
  4. TCP提供双全工通信.在连接期间双方的应用进程再任何时候都能发送数据.
  5. 面向字节流.与进程进行数据交互的形式都是以字节流的形式.

2. TCP报文的首部格式及简介

TCP首部概念图:

在这里插入图片描述
在这里插入图片描述

3.TCP首部中字段详细解读

1.序号(16bits 2bytes)

TCP协议中数据是被分成一个个的包,所以当包到达了接收方的时候,接收方就需要知道这是第几个包,序号就是用来告知接收方当前这个包在所有数据中的位置.

例如:

但是在实际通行中不太可能使用1作为开始序号,因为这样子很容易被他人攻击.

所以实际通行中会是一个随机数,这个随机数在建立连接的时候双方就 '相互交流’过了

2.ACK号(16bits 2bytes)和ACK(1 bit)

ACK号实际上是和序号打配合的,当数据的发送方发送了包之后,它需要知道包是否被成功接收了?

ACK就是接收方用来通知发送方自己成功的接收到了多少的连续字节.而且与此同时,将控制位中的ACK比特设置为1,表明ACK号字段有效

我们还注意到ACK

在这里插入图片描述

细心的人可能会注意到,ACK号和序号的长度都是16位,也就是说双方能传输的字节总数是 2^16 bytes=64 KB,这也太小了吧.事实上当ACK号是对最大值的一个 取余.这也就保证了ACK号和序号一定够用

3.数据偏移(4 bits)

因为TCP报文的头部长度是不确定的,所以我们就需要知道其中TCP头部占多少,实际的数据是从哪里开始的.

数据偏移这个字段就是为了说明从报文的多少开始是数据部分,也可以说是头部的长度.

数据偏移字段的位数是4位,也就是说能够表示 0~15 之间的数,同时数据偏移的单位是4字节(Byte).

也就是说:TCP报文的头部的长度最大值为60Bytes(15*4Bytes).也就是说可选字段的长度不能超过40Bytes

4.保留(6 bits)
5.控制位(6 bits)
  1. URG(urgent 紧急的): 当值为1时,表明紧急指针字段有效,该报文段中有紧急数据,应该优先传送
  2. ACK(acknowledgment 承认): 当ACK为1表明 ACK确认号有效. 所以在建立连接后的所有报文段的ACK都必须为1
  3. PSH(push 推):当应用程序在进行交互式通信的过程中,有时候一端的应用程序希望一个命令能够立马收到对方的响应.
  4. RST(reset 重置):当RST=1时,表明TCP连接出现严重差错,必须释放连接并且重新建立连接
  5. SYN(synchronization 同步):在TCP双方建立连接时使用,在TCP三次握手时详细介绍
  6. FIN(finish 结束):在释放连接时使用,在四次挥手时详解

URG和PSH的不同

URG说的是发送时,优先发送该报文.

PSH说的是处理时,优先处理这个报文

6.窗口(6 bits)

窗口字段,就表明了发送方的接收能力的大小,相当于在交互的时候告诉对方我的接收能力是X,你下次发送数据的时候别超过这个数,要不然我接收不了

7.检验和(16 bits)

对TCP报文中的数据进行校验

8.紧急指针(16 bits)

首先要说明的是,只有当控制位的URG为1的时候,紧急指针才生效.

紧急指针是用于指明数据部分哪些部分是紧急的.例如当 紧急指针=20,表明数据部分的前二十个字节是紧急的数据.

9.选项( 可变)
10.填充(可变 && <32bits)

TCP的首部长度一定是4Bytes的倍数(从数据偏移量的单位也可以推测出来).所以不满足情况时,就需要填充

4.TCP建立连接–三次握手

我们说过,TCP是需要双方建立连接的.这个过程就是大名鼎鼎的三次握手.

说实话即使在自学计网之前我也听过 三次握手,四次挥手.下面就让我们来好好学习一下吧.

1.为什么要三次握手建立连接呢?

首先我们应该搞清楚为什么要进行三次握手,为什么不是两次,四次? 偏偏是三次

三次握手的目的是为了建立可靠的连接.

而TCP连接的终端收发数据保证可靠性就是靠着序列号和ACK号,序列号是在初始序列号的基础上得来的

所以本质上三次握手就是相互交换初始序列号以保证连接的可靠

第一次握手 A: SYN+A的ISN(Initial Sequence Number 初始序列号)

第二次握手 B:SYN+B的ISN+确认自己记住了A的ISN

第三次握手 A:确认自己记住了B的ISN

通过上面这三次握手,双方:

  1. 都知道了对方的ISN
  2. 并且确认对方知道了自己的ISN
2.详细解读三次握手的过程

在这里插入图片描述

首先 客户端发送TCP连接请求包,服务器收到,客户端状态变为SYN-SENT, 包中头部包括

  1. SYN标志位:表明这是一个TCP连接同步请求
  2. 自己的seq(ISN)初始序列号:这是是由客户端随机计算出来的一个32位的数,是客户端发送可靠数据的保证
  3. win:自己的接收窗口大小,服务器端会根据这个大小来调整自己的发送窗口大小
  4. SACK-PERM:自己是否接受选择性确认

然后 服务器端收到了请求之后,状态变成SYN-RCVD,然后发送一个ACK确认包,包中的头部字段包括:

  1. SYN标志位:表明这是一个TCP连接同步请求
  2. 自己的seq(ISN)初始序列号:同理
  3. win:同理
  4. ACK号:客户端初始序列号+1
  5. ACK标志位:1

最后: 客户端收到了请求之后,状态变成ESTABLISHED,并且发送一个最终确认包,包中的头部字段包括:

  1. ACK标志位
  2. ACK号:服务器端初始序列号+1

5.TCP可靠传输实现

1.停止等待协议

在正常情况下,当发送方发送一个包后,接收方接收到之后会返回一个包表明收到了. 如果在一定时间内如果没有收到确认的包,那么发送方就会重新发送一次包,这就是停止等待协议.

有很多种情况会破坏它.例如 1.包在发送过程中丢失了,接收方没有收到. 或者 2.接收方接收到了,但是确认包丢失了. 亦或者 3.接收方收到了,但是确认包在路上太久了,超过了等待时间

2.连续ARQ协议和滑动窗口协议

停止等待协议可以说是一种简单,甚至有点粗糙的协议. 在发送方发送数据等待确认包到来的期间,发送方一直处于一种闲置的状态.

这可以说是一种浪费.

连续ARQ协议和滑动窗口协议就是为了解决这个问题.

连续ARQ协议是指一次发送一定数量的包,而不是一次只发一个包,等到ACK确认包到达再发另一个包

滑动窗口协议是指一次发送的包数量是有限制的,因为如果一股脑把包都发过去可能会超出接收方的处理能力.所以在ACK确认包中会设置窗口的大小(接收方能够接收的最大数据量)来动态调整
在这里插入图片描述

3.选择性确认SCAK

在滑动窗口协议下,发送方会一次传输多个包,中间的某些包可能会遗漏.但是ACK号返回的是当前已收到的连续包的序号,这样会导致很大的浪费.

在这里插入图片描述

上图中只有中间两个缺少,但是ACK号还是1025,意味着有两个包是是会重复传输的.这样显然不好.

于是我们可以用到TCP头部中的选项字段来进行选择性确认.

在这里插入图片描述

其中重要的就是left edgeright edge两个字段, left edge 和 right edge 表示的就是已经接收的字段的左右边界.在本文中的例子就是

left edge:3073

right edge:5120

4.超时重传时间

之前我们说到,如果发送方发送了包超过了一段时间还没有收到ACK确认包的话就会自动重传.

那么这段时间应该是多少呢? 有的时候网络拥堵,自然就慢,反之则快.选择一个固定的值显然是不太合适的.

所以TCP协议有一个动态调整的机制,在数据传输期间会不断测量ACK确认包的返回时间来动态调整.

6.TCP流量控制

1.通过调整窗口大小来控制流量

上面在讲到滑动窗口协议的时候有讲到接收方会通过窗口来告诉发送方自己能最大接收的数据量.

稍微思考一下就能想到其实窗口的大小可以会动态调整的,

窗口的大小主要是和TCP协议栈的缓存区域大小有关,当收到的包数据量大于接收方的处理能力的时候就会通过选项字段来调整窗口的大小

2.ACK与窗口的合并

我们知道,ACK号是在每轮数据交互中都要传输的,但是窗口大小不是每次都要都要调整的,只有接收端缓存大小改变的时候(也就是处理数据能力发生改变)的才需要通知接收方.并且会和ACK确认包一起发送,因为使用两个独立的包会消耗更多的系统资源.

7.TCP拥塞控制

1.什么是拥塞

在某段时间内,对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会坏. 例如某个网络节点的带宽是100M,但是来往的流量超过100M,这时候该节点的性能就会下降,这时候处理数据的能力可能50M都没有.

2.拥塞控制和流量控制的不同
  • 流量控制是对TCP双方的管理,当一方的处理能力下降的时候.就需要控制数据交互的量
  • 而拥塞控制则是对整个网络的管理.当发现当前网络出现拥塞,当前网络中使用TCP协议的节点都会降低数据的收发,以免造成更大拥塞
3.慢开始和拥塞避免算法

上面已经说到了拥塞的危害,那么拥塞控制最重要就是发现拥塞并且降低传输速率以避免拥塞.

慢开始拥塞避免是两个阶段.

  • 慢开始:首先,由于我们不知道网络的状况如何,所以我们就设定一个拥塞窗口cwnd慢慢发数据,如果发现在当前速率下发送网络没有什么问题的话,我们就将拥塞窗口cwnd乘以2来提高发送速率.直到到达慢开始门限

在这里插入图片描述

  • 拥塞避免:当到达慢开始门限后,我们就开始使用拥塞避免算法,拥塞窗口的变化变成线性.
    在这里插入图片描述

无论是慢开始阶段还是拥塞避免阶段,当碰到拥塞的拥塞的情况时(出现丢包情况):将拥塞窗口设置为1,并且将慢开始门限设置为原来的一半.这样迅速降低网络的负担.

4.快重传和快恢复

快重传和快恢复其实是对(慢开始,拥塞控制)的一种改进.

快重传:之前我们说过终端判断网络是否拥塞的方法就是看是否发生了丢包.如果终端发送了一个包,ACK确认包超过了等待重传的时间,终端就知道丢包了.但是这样时间太长了.于是如果发生了丢包,接收方就会立马发送三个重复的ACK确认包,让接收方立刻重传丢失的包.

在这里插入图片描述

快恢复:当终端发现出现网络拥塞的时候,使用快恢复算法的话,终端会将慢开始门限和拥塞窗口cwnd调整成拥塞前的拥塞窗口cwnd的一半,开始加法级别的拥塞避免.

5.拥塞窗口和流量控制窗口

现在有人可能会有疑问:流量控制中有一个窗口,拥塞避免也有一个窗口.这样会不会产生矛盾呢?到底用哪个窗口呢?

事实上,这并不矛盾.实际发送窗口大小=min(流量控制窗口,拥塞窗口)

8.TCP协议释放连接–四次挥手

TCP释放连接四次握手:

  1. 主动结束方:发送FIN关闭连接请求
  2. 被动结束方:返回ACK确认
  3. 被动连接方:发送FIN关闭请求
  4. 主动结束方:返回ACK确认

在这里插入图片描述

1.为什么在第四次握手的包发送后要等待一会?

这是主要是为了防止第四次的包丢失造成误操作,假如如果没有等待而且第四次的包丢失了,那么被动结束连接方没有收到ACK确认请求,就会重新发送一个FIN包,而主动结束方认为已经结束了连接.这时候如果刚才的TCP连接端口分配给了一个新的连接,这时候就会造成TCP连接中断

2.为什么要四次挥手

因为TCP连接是双全工通信(发送数据和接收数据可以同时进行),
第一,二次挥手是表明主动结束方不会在发送数据了,但是仍然可以接收数据
第三,四次挥手是表明被动连接方也不会在发送数据了.
至此TCP请求断开

UDP协议

1.UDP协议的特点

  1. UDP是无连接的,发送数据之前不需要建立连接,所以也不用像TCP那样释放连接.因此减少了开销并且降低了发送数据之前的时延.
  2. UDP发送数据后尽最大努力交付,但是不会保证可靠交互(TCP则会),因此主机不需要维持复杂的连接状态表,节省了系统资源
  3. UDP是面向报文的,发送方的UDP对应用程序提供的报文添加首部后就交付给网络层.UDP对其既不合并,也不拆分,而是保留报文的边界.
  4. UDP没有拥塞控制,因此网络中出现的拥塞不会使源主机的发送速率变慢.这样在一定程度上能保证实时性
  5. UDP支持一对一,一对多,多对一,多对多的交互通信
  6. UDP首部开销小,只有8个字节,相比TCP的20个字节要短很多

2.UDP的首部格式

UDP首部包括四个字段,每个字段占2个字节:

  1. 源端口:发送消息的端口
  2. 目标端口:接收消息的端口
  3. 长度:UDP数据报的数据部分长度
  4. 校验和:用于检测UDP用户数据在传输过程中是否发生了变更.

TCP和UDP协议应用场景

1.TCP(Transmission Control Protocol 传输控制协议)运用场景

要传输的内容需要分成多个数据报来传输.对流量控制,拥塞避免,可靠传输有要求的场景.
双方需要建立连接

案例:在网上下载一部影片,数据量通常是很大的.这个时候不可能通过一个数据包就把数据传过来了,所以要分段编号传输.并且我们要求这波影片一定要是完整的传输过来,就要求要可靠传输.

2.UDP(User Datagram Protocol)用户数据报协议运用场景

要传输的内容一个数据包就能完成,对实时性要求较高的场景(视频通话,直播)
双方不需要建立连接

案例:大家使用微信进行视频聊天时,双方要做到同时交互.所以一有数据就需要立马传输到对面,要不然你现在说了一句话对方2s之后才听见就达不到实时的效果了.
个数据报来传输.对流量控制,拥塞避免,可靠传输有要求的场景.
双方需要建立连接

案例:在网上下载一部影片,数据量通常是很大的.这个时候不可能通过一个数据包就把数据传过来了,所以要分段编号传输.并且我们要求这波影片一定要是完整的传输过来,就要求要可靠传输.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值