第三章、传输层

第一节传输层的基本服务

传输层的核心任务:应用进程之间提供端到端的逻辑通信服务,传输层是除应用层外唯一的端到端层

主机具有OSI七层模型任意一层协议;

网络核心中的路由器、交换机、集线器等只用到OSI七层模型的下三层功能

传输层功能:(分复流拥寻差错-可靠;吩咐刘墉寻差错-可靠)

  • 1)对应用层报文进行分段和重组
  • 2)面向应用层实现复用与分解
  • 3)实现端到端的流量控制
  • 4)拥塞控制
  • 5)传输层寻址
  • 6)对报文进行差错检测
  • 7)实现进程间的端到端可靠数据传输控制

传输层寻址与端口:

  • 一台计算机中,不同应用进程用进程标识符(进程ID)来区分;
  • TCP/IP体系结构网络中通过在传输层使用协议端口号,通常简称为端口(port),在全网范围内利用 "IP 地址+端口号"唯一标识一个通信端点

**端口号:**传输层端口号为16位整数,可以编号65536个(2的16次方)

传输层端口号:

  • 1、服务器端使用的端口号:熟知端口号和登记端口号(在 IANA 登记)
  • 2、客户端使用的端口号:临时性,在客户进程运行时由操作系统随机选择唯一的未被使用的端口号

无连接服务与面向连接服务:

第二节 传输层的复用与分解

**多路复用:**在源主机,传输层协议从不同的套接字收集应用进程发送的数 据块,并为每个数据块封装上首部信息(包括用于分解的信息)构成报文段,然后将报文段传递给网络层。

**多路分解:**在目的主机,传输层协议读取报文段中的字段,标识出接收套接字,进而通过该套接字,将传输层的报文段中的数据交付给正确的套接字。

**多路复用与多路分解(复用与分解/复用与分用):**支持众多应用进程共用同 一个传输层协议,并能够将接收到的数据准确交付给不同的应用进程

无连接的多路复用与多路分解:

  • 用户数据报协议(User Datagram Protocol, UDP) :Internet提供无连接服 务的传输层协议。
  • UDP套接字二元组:<目的IP地址,目的端口号>

面向连接的多路复用与多路分解

  • 传输控制协议 (Transmission Control Protocol,TCP) :Internet提供面向连接服务的传输层协议。
  • TCP套接字四元组:<源IP地址,源端口号,目的IP地址,目的端口号>

第三节 停-等协议与滑动窗口协议

不可靠传输信道在数据传输中可能发生的问题:

  • 1、比特差错:1001------1000
  • 2、乱序:数据块1、2、5、6、3、4
  • 3、数据丢失:数据块1、2、5

基于不可靠信道实现可靠数据传输采取的措施:

  • 差错检测:利用编码实现数据包传输过程中的比特差错检测。
  • 确认:接收方,向发送方反馈接收状态。ACK(肯定确认);NAK(否定确认)
  • 重传:发送方重新发送接收方没有正确接收的数据。
  • 序号:确保数据按序提交;对数据进行编号,即便不按序到达,可以按序提交
  • 计时器:解决数据丢失问题。

**停-等协议、滑动窗口协议:**是基于不可靠信道实现可靠数据传输采取的措施的两种实现

**自动重传请求协议(ARQ):**为了实现可靠数据传输,接收方通过使用肯定确认ACK 与否定确认NAK,可以让发送方知道哪些内容已被正确接收,哪些内容未被正确接收而需要重传。基于这种重传机制的可靠数据传输协议称为自动重传请求协议;停-等协议是其最简单的一个方式

1、停-等协议的工作流程

  • 1、发送方发送经过差错编码和编号的报文段,等待接收方的确认。
  • 2、接收方如果正确接收报文段,即差错检测无误且序号正确,则接收报文段,并 向发送方发送ACK,否则丢弃报文段,并向发送方发送NAK。
  • 3、发送方如果收到ACK,则继续发送后续报文段,否则重发刚刚发送的报文段。

停-等协议:所需缓冲空间小 但是 性能差、信道利用率低;使用流水线协议可以改善

**2、流水线协议:**管道协议。允许发送方在没有收到确认前,连续发送多个分组。 最典型的流水线协议:滑动窗口协议

1、增加分组序号。

2、发送方和接收方可以缓存多个分组。

发送方的发送窗口(Ws ):发送方可以发送未被确认分组的最大数量;

接收方的接收窗口(Wr ):接收方可以缓存的正确到达的分组的最大数量;

滑动窗口协议,根据窗口的大小,可以具体分为:

  • 回退N步协议:GBN协议(Go-Back-N)
  • 选择重传协议: SR协议(Selective Repeat)

对于滑动窗口协议,与信道利用率有关的是发送窗口大小

============GBN协议================

发送端缓存能力高,可以在没有得到确认前发送多个分组。 接收端缓存能力很低,只能接收1个按序到达的分组,不能缓存未按序到达的分组;

GBN协议:发送窗口WS≥1 ,接收窗口Wr =1。

GBN发送方响应的3类事件:

  • 1、上层调用。
  • 2、收到1个ACKn。GBN采用累积确认方式,即发送方收到 ACKn时,表明接收方正确接收序号n以及序号小于n的所有分组。
  • 3、计时器超时。发送方只使用一个计时器

例如:发送发,发送1,2,3,4,5;接收方收到1,2,5;显然3,4没有收到确认,所以3,4,5要重新发送

GBN 协议接收端缓存能力很低,只能接收一个按序到达的分组,不能缓存未按序到达的分组。如果其中的某 个分组差错,就会引起 GBN 发送方重发该分组及其之后的所有分组;GBN 协议比较适用低误码率、低丢包率、带宽高时延积信道,且对接收方缓存能力要求低。

==============SR协议===============

发送端缓存能力高。 接收端缓存能力高;

SR协议: 发送窗口WS>1,接收窗口Wr>1。

SR发送方响应事件:

  • 1、上层调用。
  • 2、计时器超时。发送方对每个分组进行计时。
  • 3、收到ACKn。SR协议采取逐个确认方式

例如:发送方,发送1,2,3,;接收方接受1,3 ;显然2发送方没有收到接收方的ack,所以发送方重新发送2;

信道利用率

第四节 用户数据报协议(UDP)

用户数据报协议(User Datagram Protocol,UDP): Internet传输层协议,提供无连接、不可靠、数据报尽力传输服务。
UDP的特点:

  • 1、应用进程容易控制发送什么数据以及何时发送,会出现分组的丢失和重复;适合实时性且能容忍一些数据丢失的网络应用。
  • 2、无需建立连接。
  • 3、无连接状态。
  • 4、首部开销小,只有8个字节。

**UDP数据报首部:**UDP首部四个字段,每个字段长度都是2个字节,共8个字节

  • 源端口号和目的端口号:UDP实现复用和分解。
  • 长度:指示UDP报文段中的字节数(首部和数据的总和)。
  • 校验和:接收方使用来检测数据报是否出现差错

**应用数据字段:**应用层数据占用

**UDP校验和:**提供差错检测功能;UDP的校验和用于检测UDP报文段从源到目的地传送过程中,其中的 数据是否发生了改变

**UDP校验和计算规则:**udp长度参与两次计算

  • 1、所有参与运算的内容按16位对齐求和;UDP校验和计算的内容包括3部分:UDP伪首部、UDP首部、应用数据
  • 2、求和过程中遇到溢出(即进位)都被回卷(即进位与和的最低位再相加)。
  • 3、最后得到的和取反码,就是UDP的校验和,填入UDP数据报的校验和字段

UDP伪首部:源IP地址、目的IP地址、协议号对应封装UDP数据报的IP分组的字段。 UDP协议号:17

UDP校验和的步骤:

  • 1、所有参与运算的内容按16位对齐求和(UDP伪首部、UDP首部、应用数据 三个部分的二进制数据的和)
  • 2、求和过程中遇到溢出(即进位)都被回卷(即进位与和的最低位再相加)。
  • 3、最后得到的和取反码,就是UDP的校验和,填入UDP数据报的校验和字段。反码就是 0->1;1->0;

第五节 传输控制协议(TCP)

**传输控制协议(Transmission Control Protocol ,TCP):**Internet传输层协议。提供面向连接、可靠、有序、字节流 传输服务。

  • 第一、应用进程先建立连接。
  • 第二、每一条TCP连接只有两个端点。
  • 第三、可靠交付:无差错,不丢失,不重复,按序到达
  • 第四、全双工通信。
  • 第五、面向字节流; 流:字节序列。应用程序和TCP的交互是一个个数据块,TCP把他们看做是无结构字节流。

**最大报文段长度(Maximum Segment Size , MSS):**报文段中封装的应用层数据的最大长度。

**TCP报文段首部结构:**TCP段的首部长度最短是20字节 (首部报文长度=固定首部长度(20) + 可选项)

1、源端口号字段,目的端口号字段:占16位。复用和分解上层应用的数据。

2、序号字段、确认序号字段:占32位。 序号字段:TCP的序号是对每个应用层数据的每个字节进行编号; 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到;

3、首部长度字段:占4位。指出TCP段的首部长度,以4字节为计算单位。

4、保留字段:占6位。保留为今后使用,目前值为0。

5、URG、ACK、PSH、RST、SYN、FIN各占1位,为标志位字段,取值为0或1;

  • 紧急URG=1,紧急指针字段有效,优先传送;
  • 确认ACK=1,确认序号字段有效;ACK=0时,确认序号字段无效;
  • 推送PSH=1,尽快将报文段中的数据交付接收应用进程,不要等缓存满了再交付。
  • 复位RST=1,TCP连接出现严重差错,释放连接,再重新建立TCP连接。
  • 同步SYN=1,该TCP报文段是一个建立新连接请求控制段或者同意建立新连接的确认段
  • 终止FIN=1,TCP报文段的发送端数据已经发送完毕,请求释放连接

6、接收窗口字段:占16位。向对方通告我方接收窗口的大小,用于实现TCP的流量控制

7、校验和字段:占16位。 计算方法与UDP校验和的计算方法相同。TCP协议号是6。

8、紧急指针字段:占16位。 URG=1时,才有效。指出在本TCP报文段中紧急数据共有多少个字节

9、选项字段长度可变,最短为0字节,最长为40字节

10、填充字段,取值全为0,目的是为了整个首部长度是4字节的整倍数

**TCP连接管理:**连接建立与连接拆除。

第一次握手:客户向服务器发送连接请求段:(SYN=1,seq=x) SYN=1:建立连接请求控制段; seq=x:表示传输的报文段的第1个数据字节的序列号是x,此序列号代表整个报文段的序号; 客户端进入SYN_SEND(同步发送状态)

第二次握手:服务器相应确认报文段:(SYN=1,ACK=1,seq=y, ack_seq=x+1) SYN=1:同意建立新连接的确认段;ack_seq=x+1:表示已经收到了序列号为x的报文段,准备接收序列号为x+1的报文段; seq=y:服务器告诉客户确认报文段的序列号是y;服务器由LISTEN进入SYN_RCVD(同步收到状态)

第三次握手:客户对服务器的同意连接报文段进行确认:(ACK=1,seq=x+1,ack_seq=y+1); seq=x+1:客户此次的报文段的序列号是x+1; ack_seq=y+1:客户期望接收服务器序列号为y+1的报文段; 当客户发送ACK时,客户端进入ESTABLISHED状态;当服务收到ACK后,也进入ESTABLISHED状态; 第三次握手可携带数据

为什么需要三次握手?

  • 第一次握手:客户发送请求,此时服务器知道客户能发送数据。
  • 第二次握手:服务器发送确认,此时客户知道服务器能发送数据能接收数据。
  • 第三次握手:客户发送确认,此时服务器知道客户能接收数据。

**TCP连接拆除:**四次挥手

第一次挥手: 客户向服务器发送释放连接报文段:(FIN=1,seq=u) FIN=1:发送端数据发送完毕,请求释放连接;seq=u:传输的第一个数据字节的序号是u; 客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态)

第二次挥手:服务器向客户发送确认段:(ACK=1,seq=v,ack_seq=u+1);ACK=1:确认字号段有效; ack_seq=u+1:服务器期望接收客户数据序号为u+1;seq=v:服务器传输的数据序号是v; 服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待);客户端收到ACK段后,由FIN_WAIT_1进入FIN_WAIT_2

第三次挥手: 服务器向客户发送释放连接报文段:(FIN=1,ACK=1,seq=v+1,ack_seq=u+1); FIN=1:请求释放连接;ACK=1:确认字号段有效;ack_seq=u+1:表示服务器期望接收客户数据序号为u+1;seq=v+1:表示自己传输的第一个数据字节的序号是v+1;服务器状态由CLOSE_WAIT进入LAST_ACK(最后确认状态)

第四次挥手: 客户向服务器发送确认段:(ACK=1,seq=u+1,ack_seq=w+1);ACK=1:确认字号段有效;ack_seq=v+1+1:表示客户期望接收服务器数据序号为v+1+1; seq=u+1:表示客户传输的数据的序号是u+1;客户端状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,进入CLOSED状态; 服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED

**确认序号:**期望从对方接收的字节序号,即该字节对应的序号尚未到达,该序号之前的字节已全部接收。

TCP可靠数据传输:

**可靠:**保证接收方应用进程从缓冲区读出的字节流与发送方发出的字节流是完全一样的

TCP实现可靠数据传输服务的工作机制

1、应用层数据被分割成TCP认为最适合发送的数据块(最大报文段长度(Maximum Segment Size , MSS): 报文段中封装的应用层数据的最大长度)

2、序号,发送方对发送的数据包进行编号,确保数据按序提交给接收方。(序号:一个字节占用一个序号。序号字段指的就是一个报文段第一个字节的序号)

3、确认,接收方向发送方反馈接收状态,确认是否正确接收数据。 TCP采取累计确认。

4、查错检测,利用差错编码实现数据包传输过程中的比特查错检测(甚至纠正)。

5、重传,发送方重新发送接收方没有正确接收的数据(快速重传: TCP发送方接收到对相同序号的3次重复ACK,就说明被重复确认的报文段已丢失,这时候即便没有超时,也会重发该报文段)

6、计时器,在发送方引入计时器,解决数据丢失问题(计时器超时时间设置:TimeoutInerval=EstimatedRTT+4×DevRTT; EstimatedRTT:抽样RTT的加权移动平均值。 DevRTT:偏差RTT)

TCP生成ACK的策略:

  • 1、具有所期望序号的报文段按序到达,所有在期望序号及以前的报文段都已被确认。TCP延迟500ms发送ACK。
  • 2、具有所期望序号的报文段按序到达、且另一个按序报文段在等待ACK传输,TCP接收方立即发送单个累计ACK,确认以上两个按序到达报文段;例如:接收方刚刚收到4,正准备返回ACK5。此时5来了, 则接收方返回ACK6
  • 3、拥有序号大于期望序号的失序报文段到达,TCP接收方立即发送重复ACK,指示下一个期望接收字节的序号;例如:接收方返回ACK5,但是6到了则接收方返回三次重复的ACK5
  • 4、收到一个报文段,部分或完全填充接收数据间隔;例如:接收方收到1 2,且返回对1 2的确认,后来又收到了4 5 6。这时3来了, 则接收方返回ACK7

**TCP的流量控制:**协调发送方与接收方数据的发送与接收速度;在通信过程中,接收方设置报文段的接收窗口字段来将窗口大小通知给发 送方。

TCP的拥塞控制:

**网络拥塞:**太多的主机以太快的速度向网络中发送太多的数据,超出了网 络处理能力,导致大量数据分组拥挤在中间设备队列中等待转发,网络性能显 著下降的现象

**拥塞控制:**通过合理调度、规范、调整向网络中发送数据的主机数量、发 送速率、数据量,以避免拥塞或消除已发生的拥塞;拥塞控制可以在不同的层实现,ATM网络是在网络层进行,Internet是在传输层进行(通过TCP实现)

拥塞控制算法:慢启动、 拥塞避免 、快速重传、 快速恢复

1、拥塞窗口(CongWin):连接开始,为1MSS ; 1个最大报文段长度(Maximum Segment Size , MSS)

2、阈值(Threshold):临界值

======================慢启动=====================

慢启动算法:在TCP连接建立时,每经 过1个RTT时间,拥塞窗口增大一倍。

======================拥塞避免===================

拥塞避免算法:当拥塞窗口大于等于阈 值时,每经过1个RTT,拥塞窗口的值 加1。

====================快速重传=========================

快速重传:接收端收到3次重复确认,则推断被重复确认的报文段已经丢失,于是立 即发送被重复确认的报文段

==============快速恢复算法==================

思考:怎样算是报文段丢失了: 1、收到三次重复确认 。 2、计时器超时

快速恢复算法:当发生3次重复确认时,网络拥塞程度不是很严重。 阈值和拥塞窗口的调整方法:是直接从新的阈值开 始,直接进入拥塞避免阶段。

例如:发生3次重复确认时,当前拥塞窗口为24MSS,当前阈值为16MSS。 新的阈值:为当前拥塞窗口的一半。 新的阈值= 24MSS÷2=12MSS;新的拥塞窗口:调整为新的阈值。 新的拥塞窗口=新的阈值=12MSS;调整好新的阈值和新的拥塞窗口后,使用拥塞避免算法增加拥塞窗口大小。

例如:发生计时器超时,当前拥塞窗口为24MSS,当前阈值为16MSS。 新的阈值:为当前拥塞窗口的一半, 新的阈值= 24MSS÷2=12MSS; 新的拥塞窗口:直接调整为1MSS,新的拥塞窗口=1MSS; 调整好新的阈值和新的拥塞窗口后,使用慢启动,拥塞避免算法增加拥塞窗口 大小。

窗口调整的基本策略 (Additive Increase,Multiplicative Decrease ,AIMD): 网络未发生拥塞时,逐渐"加性"增大窗口。 网络拥塞时"乘性"减小窗口。

拥塞预防策略: 流量整形技术:规范主机向网络发送数据的流量。

为预防拥塞出现在网络的传输层上可采取的策略是:确定超时策略。

**TCP拥塞控制的基本思想:**AIMD

古之学者为己,今之学者为人

相关推荐
破局缘7 分钟前
apt文件问题ruby.list文件
开发语言·windows·ruby
晚安~~15 分钟前
社区生活超市系统|Java|SSM|JSP|
java·开发语言·tomcat·maven
Faylynn17 分钟前
Python:程序中如何引用环境变量
开发语言·python
小堃学编程18 分钟前
Python学习(二)—— 基础语法(上)
开发语言·python
会思想的苇草i20 分钟前
JavaScript--原型与原型链
开发语言·前端·javascript·设计模式·原型·原型模式·原型链
向宇it21 分钟前
【从零开始入门unity游戏开发之——C#篇06】变量类型转化和异常捕获
开发语言·游戏·unity·c#·游戏引擎
wks1989121522 分钟前
线程sleep的时候会释放锁吗
开发语言·c++·算法
伍贰什丿23 分钟前
C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发
c语言·开发语言·学习·游戏
怒码ing41 分钟前
【考前预习】4.计算机网络—网络层
网络·计算机网络
gywl41 分钟前
计算机网络-传输层 TCP协议(下)
网络·tcp/ip·计算机网络