OSI参考模型——传输层:TCP、UDP协议详解

2021年11月8日 1点热度 0条评论 来源: JeffCoding

博文目录

一、传输层与传输层协议
二、用户数据报协议(UDP)
三、传输控制协议TCP
四、TCP协议滑动窗口

一、传输层与传输层协议

1. 传输层的基本功能

  1. 传输层的本质就是为分布在不同地理位置的计算机的进程通信提供可靠的端-端连接和数据传输服务,作用是实现分布式进程通信,它的传输单位是报文
  2. 屏蔽了传输网实现技术的差异性,使得应用层在设计各种网络应用系统时,只需要考虑什么样的传输层协议,而不需要考虑数据传输的细节
  3. 传输层把点-点通信转化到端-端通信(端-端通信的实现使用套接字)

2. 传输层的传输单元——传输协议数据单元(TPDU)

传输层中实现传输层协议的软件称为”传输实体“,传输层之间出传输的报文称为”传输协议数据单元(TPDU)“

数据的传输过程

  1. 传输层在TPDU前加上TPDU头,传输到网络层加上IP分组头形成IP分组;
  2. IP分组传输到数据链路层加上帧头和帧尾形成帧;
  3. 帧经过物理层目的主机后,经过数据链路层,网络层处理,传输层接收到TPDU头,对TPDU数据完成相应的动作。

3. 套接字

传输层实现分布式进程通信,首先就要解决进程标识的问题,在计算机网络中,只有知道IP地址和端口号,才能唯一找到通信的进程,即:
传输层端口号 + 网络层IP地址 = IP:端口

用一个例子来类比:
要找XX学校教学楼的601教室,所以必须知道学校地址和课室号,学校相当于IP地址,601教室相当于端口号

4. 分布式进程标识方法

TCP/IP传输层的寻址是通过TCP与UDP端口号来实现的,TCP与UDP规定用不同的端口号来表示不同的应用程序
在TCP/IP协议中,端口号的数值取0-65535,且端口号分为三种类型:熟知端口号,注册端口号和临时端口号

熟知端口号

TCP/UDP给每种标准的Internet服务器进程分配一个确定的全局端口号,由IANA同一分配

注册端口号

当用户开发新的网络应用程序时,可以为这种新的网络应用程序的服务器程序在IANA登记一个注册端口号

临时端口号

由运行在客户上的TCP/UDP软件随机选取的,只对一次进程通信有效

网络中的两台主机要实现进程通信,它们必须事先约定好传输层协议,如果一台用TCP,另一台用UDP,由于两种协议的报文格式,端口号分配的问题,会使得两台主机无法正常通信。
如果考虑到进程标识和多重协议识别,网络中一个进程的全网唯一的标识应该用三元组来表示:协议+IP地址+端口号;当两台主机通信时,一个完整的通信标识需要五元组协议+本地IP地址+本地端口号+远程地址+远程端口号

5. 传输层的多路复用和多路分解工作流程

一台运行TCP/IP协议的主机可能同时运行不同的应用程序,这些应用程序有的使用TCP,有的使用UDP,而TCP/IP协议允许多个不同应用程序的数据,同时使用IP地址和一个物理连接来发送和接受数据

多路复用和多路分解工作流程:
1. IP协议把TCP和UDP的TPDU都封装在一个IP分组上,发送到接收端
2. 接收端从IP分组中拆出TPDU传送到传输层
3. 传输层更具不同TPDU的端口号,区分出不同的TPDU属性,分别传送到不同的应用程序

6. TCP、UDP协议和应用层协议的关系

应用层协议和传输层协议有三种类型:依赖TCP协议的应用层协议,依赖UDP协议的应用层协议,同时依赖TCP、UDP协议的应用层协议

依赖TCP协议的应用层协议:TELNET(虚拟终端协议)、SMTP(电子邮件协议)、FTP(文件传输协议)、HTTP(超文本传输协议)
依赖UDP协议的应用层协议:SNMP(简单网络管理协议)
同时依赖TCP、UDP协议的应用层协议:DNS(域名服务协议)

二、用户数据报协议(UDP)

1. UDP协议的特点

  1. 是一种无连接不可靠的协议
    1) 不需要通信双方建立连接
    2)除了一种可选的校检和之外,几乎没有提供其他的保证数据传输可靠性的措施
    3)如果检测出收到的分组出错,就丢弃,不确认也不通知发送端要求重传
  2. 是一种面向报文的协议
    对应用程序提交的报文,添加UDP头,构成一个TPDU就发送给网络层

2. UDP协议报文格式

端口号

源端口号和目的端口号

长度

指包括报头在内的用户数据报的总长度,UDP的报头规定为8字节,而UDP长度字段为16位,因此数据最大值为 2 ^ 16 - 8 = 65527

校检和

可选部分,用来检测用户数据报、UDP报头和伪报头传输过程中是否出错

3. 伪报头

伪报头的作用

  1. 伪报头不是用户数据报的真正头部(是UDP头),是临时加上去的
  2. 只在计算时起作用,不向上传输,也不向下传输
  3. 如果没有伪报头,检验的对象只是UDP报文,也能判断UDP报文传输是否出错;但是考虑到IP分组出错,那么分组很可能会传送到错误的主机,因此设置伪报头

4. UDP协议适用场景

UDP协议简洁,效率高,处理速度快,在P2P会话类中很突出,适用于实时语音与视频传输
1. 视频播放应用
2. 简短的交互式应用
3. 多播与广播应用

三、传输控制协议TCP

1. TCP协议的特点

1. 面向连接的传输服务

TCP传输数据前,源进程端口和目标进程端口必须建立了TCP传输连接

2. 支持字节流的传输


字节流中每一个字节都会有编号,虽然是面向字节的,但是不是每字节传输,而是把字节流分段,一个端的多个字节打包成一个TCP报文段发送

3. 支持全双工通信

  1. 双方进程任何时候都可以发送数据
  2. 由于通信双方都设有发送和接受缓冲区,应用程序把将发送的数据字节提交到发送缓冲区,TCP协议控制发送过程
  3. 接受到数据后,存放到接受缓冲区,由高层应用程序从缓冲区读取数据

4. 支持同时建立多个并发的TCP连接

支持一个服务器与多个客户端,也支持一个客户端与多个服务端

5. 支持可靠的传输服务

提供确认重传拥塞控制功能

2.TCP协议报文格式

TCP报头长度为20~60字节,其中基本长度为20字节,选项部分长度可变为40字节

端口号

包括源端口号和目的端口号

序号

TCP是面向字节流的,它要为字节流中的每一个字节按顺序编号当TCP连接建立时,双方需要各自产生初始序号,然后为字节顺序编号。
例如一个TCP连接需要发送4500个字节,初始序号为10000,分为5个报文段发送,则:
第一个报文段的字节序号范围:10000~10999
第一个报文段的字节序号范围:11000~11999
第一个报文段的字节序号范围:12000~12999
第一个报文段的字节序号范围:13000~13999
第一个报文段的字节序号范围:14000~14499

确认号

表示一个进程已经正确接受序号为N的字节,要求发送端发送序号为N+1的字节

报头长度

报头长度在20~60字节

保留

字段长度为6位

控制

控制字段定义了6种不同的控制位,同一时间可以设置1位或多位,控制字段用于TCP的建立连接和终止、流量控制,以及数据传送过程
1. URG(紧急位)
表示该报文段优先级高,尽快发送
2. ACK(确认位)
TCP连接确定后的所有报文的ACK都要为1
3. PSH(推送位)
当两个进程交互式通信时,一端应用进程希望输入一个命令后,能够立即得到对方的响应,则PSH置为1
4. RST(复位位)
复位位为1,有两种含义:一是因主机崩溃等原因造成TCP连接出错,需要立即释放连接,然后重建连接;二是拒绝一个非法TCP报文或拒绝释放一个连接
5. SYN(同步位)
用于在建立连接时同步序号。例如,当SYN=1,ACK=0,表示这是一个连接建立请求报文,同一建立连接的响应报文为SYN=1,ACK=1
6. FIN(终止位)
FIN=1表示请求释放TCP连接

窗口大小

窗口大小用于接收端通知发送端,下次最多可以发送多少字节数的报文

校检和

计算校检和和UDP相同,只是UDP校检和是可选的,TCP是必须的

最大段长度(MSS)

表示TCP报文数据部分的最大长度,默认为536字节,它的大小可以直接影响发送和接受缓冲区设置的大小和使用效率

3. TCP连接的建立(三次握手)和释放(四次握手)

TCP协议的工作分为三个阶段:连接建立,报文传输,连接释放

1. TCP连接建立

TCP连接建立需要经过三次握手

关于为什么要三次握手,这涉及到一个著名的两军问题

第一次:A军派人穿过红军告诉B军要发动总攻
第二次:B军派此人再次穿过红军A军,告知A军,B军已收到(此时A确定了B已经收到,但是B不确定送信的人回去时有没有被红军俘获,所以需要第三次)
第三次:A再次派该人穿过红军,告知B军,我已经收到了你的确认

(seq为随机生成的序号,ack为确认号)
记住不要弄混ACK和ack,ACK是标志位,ack是确认序号

SYN=1:连接建立请求报文
SYN=1+ACK=1:连接建立请求确认报文
ACK=1:连接建立请求确认报文

三次握手:
1. 客户端开始为CLOSE状态,发送SYN=1,报文序号seq=x至服务端,此时客户端进入SYN-SEND状态
2. 服务端开始为LISTEN状态,表示正在监听连接,服务端接受到SYN,于是发送SYN+ACK的报文,报文序号seq=y,ack为x+1,表示我已经接受到客户端的序号x的报文了,下次客户端要给我发送序号x+1的报文,此时进入SYN-RCVD状态
3. 客户端接收到SYN+ACK后,发送ACK,seq=x+1(因为第2步中服务端ack=x+1,表示要客户端下次要发送x+1的报文给我),ack=y+1,此时双方进入到ESTABLISHED状态,连接成功

2.TCP连接释放

FIN-WAIT-1:表示等待对方的FIN报文
FIN-WAIT-2:也是表示等待对方的FIN报文,此时是进入到了半关闭状态
TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了,如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
CLOSE:表示已关闭连接

TCP连接释放需要四次握手
1. 客户机发送”连接释放请求报文“,提出连接释放请求
2. 服务器收到”连接释放请求报文“后,发送”连接释放请求确认报文“,服务器进程向高层应用进程通知客户请求释放TCP连接,此时客户机到服务器的TCP连接释放,但是服务器到客户机的TCP连接未断开,此时如果服务器还有数据需要发送时可以继续发送。这种状态为”半关闭“状态
3. 服务器没有数据要发送后,服务器向客户发送”连接释放请求报文“。提出连接释放请求
4. 客户机收到”连接释放请求报文“后,发送”连接释放请求确认报文“,此时TCP连接完全释放

3. TCP中的计时器

1. 保持计时器

  • 用于防止TCP连接处于长时间空闲,如果发送10个探测报文(每一个间隔75s)还没有响应,则假设客户端故障,终止连接

2. 时间等待计时器

  • 用于保证TCP连接释放过程正常进行
    跟为什么要等待2MSL时间,再进入CLOSE状态有关

3. 重传计时器

  • 用于控制报文确认和等待重传的时间。
  • 当发送端TCP发送一个报文时,首先将一个报文的副本放入重传队列,然后启动重传计时器,重传计时器设定一个值,例如400ms,然后开始倒计时;如果倒计时结束,还没有收到ACK,发送端重传该报文
  • 重传也有次数,默认5次

4. 坚持计时器

  • 为什么出现这个计时器?
    执行滑动窗口控制过程中,要求发送端接受到“零窗口通知”就停止发送,会持续到 接受端发送 “非零窗口通知”。如果这个”非零窗口通知“丢失了,这样发送端就会永远的等待接收端的”非零窗口通知”,会进入死锁状态。
  • 用于解决什么问题?
    用于防止非零窗口通知丢失,造成死锁现象。
  • 工作流程?
    当发送端的TCP接受到一个零窗口通知时,启动坚持计时器;当坚持计时器时间到,发送端的TCP发送一个零窗口探测报文给接收端,作用是提示接收端”非零窗口通知”丢失,必须要重传

四、TCP协议滑动窗口

2. 滑动窗口和确认、重传机制

差错控制

TCP协议通过滑动窗口机制来跟踪和记录发送字节的状态,实现差错控制功能
滑动窗口大小:接收端通知发送端,下次最多可以发送多少字节数的报文

TCP使用两个缓存和两个个窗口来控制字节流的传输

  1. 发送端TCP有一个缓存,用来存储应用进程准备发送的数据,发送端对这个缓存设置一个发送窗口,只要窗口值不为0就可以发送报文段
  2. 接受端TCP有一个缓存,用于接受字节流,等待应用进程读取,接收端设置一个接受窗口,窗口只大小等于接受缓存可以接受多少字节流的大小

注意:
1. 发送窗口 不能大于 接受窗口,也就是说,发送窗口的值是根据接受窗口的值来确定的
2. 当接受缓冲区满了时,接受窗口为0,此时会发送一个“零窗口通知”给发送端,这是发送端会停止发送(跟坚持计时器有关)

窗口滑动流程:
1. 差错控制和传输的字节流状态分类

对字节流状态的跟踪,可以对正确传输的字节流进行确认,从而达到利用滑动窗口协议控制差错的目的

2. 发送窗口和可用窗口

发送窗口:发送端每一次发送过程中能够连续发送的字节数取决于发送窗口的大小,长度等于第2、3类字节数之和
可用窗口:表示发送端随时可以发送的字节数,长度为第3类字节数

3. 发送完毕后的窗口变化

4. 处理确认并滑动窗口

处理完上面的报文后,窗口向左滑动,准备发送下一报文段

选择重传

选择重传和数据链路层的相同,有拉回方式和选择重传方式

2. 滑动窗口和流量控制、拥塞控制

流量控制

作用:流量控制的目的是为了控制发送端的发送速率,使之不超过接收端的接受速率,防止接收端来不及处理而导致报文段丢失

流量控制是点-点链路的通信量的局部控制

流量控制流程:

(tips:通知窗口值=0表示接收缓冲区已满,发送端暂停发送;理解此图要记住发送端发送的数据,首先发送到接收端缓冲区,再由应用程序读取)

拥塞控制

作用:拥塞控制用于防止过多的报文进入网络,而造成路由器与链路过载。

拥塞控制是网络报文总量的全局控制

当拥塞发生时的条件:
对网络资源需求 > 网络可用资源

拥塞窗口
拥塞窗口:发送端根据拥塞情况确定的窗口值,是TCP实现拥塞控制最基本的手段,发送端在确定拥塞窗口大小时,可以采用慢开始算法(从小到达逐步增加拥塞窗口)拥塞避免算法

发送窗口,通知窗口(接收端的窗口),拥塞窗口
发送窗口的确定,应该是通知窗口和拥塞窗口的较小值

慢开始算法和拥塞避免算法的思想

只要发现网络上没有出现拥塞,就增大拥塞窗口;当出现拥塞,就减小窗口值,问题是如何确定拥塞?

怎么样为拥塞

什么是一次往返:发送端发送报文给接收端,接收端在规定时间内返回了确认报文。

如果一次往返异常(没有接受到接收端的确认报文),说明出现拥塞

慢开始算法

以二进制指数增长

第一次往返:拥塞窗口设为2,然后发送2个最大报文段
第二个往返:拥塞窗口设为4
第三次往返:拥塞窗口设为8
第四次往返:拥塞窗口设为16
………….

拥塞避免算法

一次往返,拥塞窗口+1

TCP如何拥塞控制?

设置一个阀值(慢开始阀值)k,当前拥塞窗口为cwnd
- 当cwnd < k时,使用慢开始算法
- 当swnd > k时,使用拥塞避免算法
- 当cwnd = k时,都可以使用

假设出现异常时,会出现什么样的变化?
- 拥塞窗口置为1
- 阀值置为原来的1/2,即k/2

    原文作者:JeffCoding
    原文地址: https://blog.csdn.net/jeffleo/article/details/53967254
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。