计算机网络自顶向下方法第3章-传输层 (Transport Layer).1
3.1 概述和运输层服务
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。
3.1.1 运输层和网络层的关系
网络层提供了主机之间的逻辑通信,而运输层为运行在不同的主机上的进程提供了逻辑通信。
3.1.2 因特网运输层概述
Internet上提供TCP(传输控制协议) 和 UDP(用户数据报协议)两种
3.2 多路复用和多路分解
一个进程有一个或多个套接字(socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。
- 接收端将运输层报文段中的数据交付到正确的套接字(即不同的进程)的工作称为多路分解(demultiplexing)。
- 而在源主机中从不同套接字中收集数据块,并为每个数据块封装上头部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用(multiplexing)。
1.无连接的多路复用与多路分解
在运输层,无连接的网络传输是通过UDP来实现的,一个UDP套接字是由一个含有目的IP地址和目的端口号的一个二元组来全面标识的。
主机收到UDP段后检查段中的目的端口号,并将UDP段导向绑定在该端口号的Socket,因此如果两个UDP报文段有不同的源IP地址/端口号,却有相同的目的端口号,那么两个报文段将通过相同的目的套接字被定向到相同的目的进程。
2.面向连接的多路复用与多路分解
在运输层中面向连接的网络传输多使用TCP,而TCP套接字和UDP套接字之间有一个细微的差别,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。当一个TCP报文段从网络到达一台主机时,主机会使用全部4个值来将报文段定向,即多路分解到相应的套接字。
3.3 无连接运输 : UDP
UDP的优势
- 应用层能更好发控制要发送的数据和发送时间。
- 无须建立连接。
- 无连接状态。
- 分组首部开销小。
3.3.1 UDP报文段结构
UDP报文段结构由RFC 768定义,UDP首部只有4个字段,每个字段由两个字节组成。
- 源端口号: 本机(客户端)的应用程序的套接字所对应的端口号,服务器端可利用此端口号向客户端发送数据。
- 目的端口号: 服务端上的应用进程的套接字所对应的端口号,例如HTTP服务器的80端口。
- 长度:指明了首部和数据部分的UDP报文段的总长度,单位为字节,即首部+数据。
- 检验和: 提供了差错检测功能,即检验和用于确定当UDP报文段从源到达目的时,其中的比特是否发生了改变。
3.3.2 UDP 检验和
- 发送方
- 将段的内容视为16-bit整数
- 校验和计算:计算所有整数的和,进位加在和的后面,将得到的值按位求反,得到校验和
- 发送方将校验和放入校验和字段
- 接收方
- 计算所得到段的检验和,并将其余检验和字段进行比较。
- 如果不相等,则检验出错误,但若相等也可能有错误。
3.4 可靠数据传输原理
3.4.1 构造可靠数据传输协议
1.经完全可靠信道的可靠数据传输 :rdt 1.0
有限状态机(FSM) 可以表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,下图即表示发送方和接收方的有限状态机,底层信道是完全可靠的,发送方和接收方有各自的FSM,每个FSM都只有一个状态。
(图解:FSM描述中的箭头指示了协议从一个状态变迁到另一个状态。引起变迁的事件显示在横线的上方,事件发生时所采用的运动显示在横线的下方。FSM的初始状态用虚线表示。)
- 因为信道可靠,接收方也不需要提供任何反馈信息给发送方
- 假定了接收方接收数据的速率能够与发送方发送数据的速率一样快,所以接收方也没有必要请求发送方慢一点发送。
2.经具有比特差错信道的可靠数据传输: rdt2.0
下图为rdt 2.0 的有限状态机描述图,该数据传输协议(自动重传请求协议)采用了差错检测、肯定确认与否定确认。
- 在发送端左边的初始状态中,发送端协议正等待来自较高层传下来的数据。当触发
rdt_send(data)
事件时:- 通过
sndpkt = make_pkt(data, checksum)
产生一个包含待发送数据且带有校验和的分组 - 然后将该分组通过
udt_send(sndpkt)
发送到信道中
- 通过
- 执行完上述的两个动作后,发送端的状态变迁为“等待接收接收端的 ACK 或 NAK 分组”。即转变为右侧状态,接下来根据接收端的响应不同会有不同的变迁方案:
- 如果收到了一个 ACK 分组(
rdt_rcv(rcvpkt) && isACK(rcvpkt)
),那么发送方知道最近一个分组已经被正确接收,因此协议返回左边状态,继续等待下一次由较高层传下来的数据发送请求 - 如果收到了一个 NAK 分组(
rdt_rcv(rcvpkt) && isNAK(rcvpkt)
),那么发送端知道接收端接收到的分组是受损的,所以调用udt_send(sndpkt)
重新发送该分组,然后状态不变,继续等待接收接收端的 ACK 或 NAK 分组。
- 如果收到了一个 ACK 分组(
在上述协议中,当发送方处于等待ACK或NAK状态时,它不能从上层获得更多数据。这样子的协议被称为停等协议 (stop-and-wait)。
- rdt 2.0 的接收端仍然只有一个状态。状态变迁取决于收到的分组是否受损,有两种方式:
- 如果收到的分组受损,即
rdt_rcv(rcvpkt) && corrupt(rcvpkt)
,则返回 NAK 分组 - 如果收到的分组完好,即
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
,则返回 ACK 分组
- 如果收到的分组受损,即
- 处理完后仍然返回自身这个状态,继续等待下一次从底层接收分组并处理。
3.经具有比特差错的丢包信道的可靠数据传输 rdt 3.0
在现实的网络环境中,除了比特受损外,底层信道还会丢包;有很多可能的方法可以解决丢包问题,这里我们让发送方负责检测和恢复丢包工作。
假定发送端传输一个数据分组,该分组发生丢失 或者 接收端对该分组的 ACK 发生了丢失。在这两种情况下,发送端都收不到应当到来的接收端的响应。所以,如果发送端愿意等待足够长的时间以确定该分组缺失已丢失,则它只需要重传该数据分组即可。
从发送端的观点来看,重传是一个万能灵药。为了实现基于时间的重传机制,需要一个倒数计时器 (countdown timer),在一个给定的时间量过期之后,可中断发送方。发送方需要做到:1)每次发送一个分组(包括第一次分组和重传分组)时,就启动一个定时器;2)相应定时器中断;3)终止定时器。
下图是rdt 3.0
的发送方FSM,该协议运行在可能发生出错和丢失的信道上。
rdt 2.2 协议中的接收端有限状态机描述图仍然适用于 rdt 3.0 协议,下面我仍然用文字来简要描述一下上图中的发送端发送分组流程:
- 首先由较高层触发
rdt_send(data)
事件,通过sndpkt = make_pkt(0, data, checksum)
产生一个序号为 0,包含待发送数据且带有校验和的分组,接着通过udt_send(sndpkt)
将其发送到信道中并启动定时器,然后状态变迁为“等待接收接收端的 ACK 0” - 当发送端在“等待接收接收端的 ACK 0”的时候:
- 如果收到了受损的分组(即
corrupt(rcvpkt)
)或者收到了 ACK 1(即isACK(rcvpkt, 1)
,也就是收到了自己发送的上一个分组的 ACK),则直接忽略 - 如果定时器时间到,则由
udt_send(sndpkt)
重新发送该分组并重新启动定时器 - 如果收到了完好的分组且 ACK 为 0,那么发送端知道接收端已经成功接收了刚才发送的序号为 0 的分组,直接停止定时器,此时发送端状态变迁到等待较高层传下来的数据发送请求
- 如果收到了受损的分组(即
- 注意在继续等待从较高层传下来的数据发送请求的过程中,如果收到了任何分组数据包,都直接忽略,因为它们一定是冗余的
3.4.2 流水线可靠数据传输协议
停等协议可能会限制底层网络硬件所提供的能力
解决方法是:不使用停止等待方式,运行发送方发送多个分组而无需等待确认。由于许多从发送方向接收方输送的分组可以被看成是填充到一条流水线中,因此这种技术被称为流水线 (pipelining)。当然,流水线会增加协议的复杂度:
- 必须增加序号范围
因为信道中的分组要有一个唯一的序号,会有多个分组在信道中未被确认。
- 协议的发送方和接收方必须缓存多个分组
发送方至少应该缓存已经发送却还没有被确认的分组。接受方也许应该缓存已经正确接收的分组。
- 所需的序号范围和对缓存大小的要求取决于协议如何处理丢失、损坏及延时大的分组
解决流水线差错错误的两种基本思路:回退N步和选择重传。
3.4.3 回退N步
GBN 协议被称为滑动窗口协议 (silding-window protocol)
3.4.4 选择重传
选择重传协议让发送方仅重传那些它怀疑在接收方出错的分组,避免了不需要的重传。
参考:
https://www.cnblogs.com/hithongming/p/9379397.html
https://www.cnblogs.com/oxspirt/p/6496434.html
https://www.cnblogs.com/huahuahu/p/liu-shui-xian-ke-kao-shu-ju-chuan-shu-xie-yi.html
计算机网络自顶向下方法第3章-传输层 (Transport Layer).1的更多相关文章
- 计算机网络自顶向下方法第3章-传输层 (Transport Layer).2
3.5 面向连接的运输: TCP 3.5.1 TCP连接 TCP是因特网运输层的面向连接的可靠的运输协议. TCP连接提供全双工服务(full-duplex service). TCP连接是点对点的连 ...
- 传输层-Transport Layer(上):传输层的功能、三次握手与四次握手、最大-最小公平、AIMD加法递增乘法递减
第六章 传输层-Transport Layer(上) 6.1传输层概述 在之前的几章内容中,我们自底向上的描述了计算机网络的各个层次,还描述了一些处于不同层次下的经典网络协议(如以太网.无线局域网.或 ...
- 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解
第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...
- 计算机网络自顶向下方法第4章 网络层:数据平面 (Network layer)
4.1 网络层概述 网络层主要功能为转发(将数据从路由器输入接口转移到合适的输出接口)和路由选择(端到端的路径选择),每台路由器都有一张转发表,用最长前缀匹配规则来转发. 4.1.1 转发和路由选择 ...
- 计算机网络自顶向下方法第2章-应用层(application-layer).1
2.1 应用层协议原理 2.1.1网络应用程序体系结构 1)在客户-服务器体系结构 (client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为 ...
- 计算机网络自顶向下方法第2章-应用层(application-layer).2
2.4 DNS:因特网的目录服务 2.4.1 DNS提供的服务 DNS的定义 实体层面看,DNS是一个由分层的DNS服务器实现的分布式数据库 协议层面看,DNS是一个使得主机能够查询分布式数据库的应用 ...
- 《计算机网络 自顶向下方法》 第2章 应用层 Part1
常见的应用层协议有哪些? HTTP(HyperText Transfer Protocol):超文本传输协议 FTP(File Transfer Protocol):文件传输协议 SMTP(Sim ...
- 第6章 传输层(详解TCP的三次握手与四次挥手)
第6章 传输层 传输层简介 传输层为网络应用程序提供了一个接口,并且能够对网络传输提供了可选的错误检测.流量控制和验证功能.TCP/IP传输层包含很多有用的协议,能够提供数据在网络传输所需的必要寻址信 ...
- 【知识强化】第五章 传输层 5.3 TCP协议
这节课我们来学习一下TCP协议的特点以及TCP报文段的格式. 首先呢我们来看一下TCP有哪些特点呢.之前我们说过TCP它是一个比较可靠的面向连接的协议,所以最主要的特点它是可以面向连接的一种传输层协议 ...
随机推荐
- This means that only a small number of nodes must be read from disk to retrieve an item.
http://cis.stvincent.edu/html/tutorials/swd/btree/btree.html Introduction A B-tree is a specialized ...
- webpack4 中的最新 React全家桶实战使用配置指南!
最新React全家桶实战使用配置指南 这篇文档 是吕小明老师结合以往的项目经验 加上自己本身对react webpack redux理解写下的总结文档,总共耗时一周总结下来的,希望能对读者能够有收获, ...
- servlet串行拦截器实现例子
至于串行过滤器有什么作用,我实在不知.我的理解是它只是说明 过滤器的串行运行方式 需求:当用户没有登录访问更新页面的时候,跳转到登录页面 1.登录页面:login.jsp <%@ page la ...
- 机器学习(十六)— LDA和PCA降维
一.LDA算法 基本思想:LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的.这点和PCA不同.PCA是不考虑样本类别输出的无监督降维技术. 我们要将数据在低维度上进行投影,投 ...
- linux应用之mysql数据库指定版本的yum安装(centos)
A Quick Guide to Using the MySQL Yum Repository Abstract The MySQL Yum repository provides RPM packa ...
- [Tyvj Aug11] 黄金矿工
传送门 Description 黄金矿工是一个经典的小游戏,它可以锻炼人的反应能力.该游戏中,可以通过“挖矿”获得积分并不断升级.玩家可以在线玩flash版黄金矿工,也可以下载后玩单机版黄金矿工.目前 ...
- 新版ycsb运行mapkeeper成功
bin/ycsb load mapkeeper -P workloads/workloada 首先,按照上面一个帖子将mapkeeper的jar包进行mvn安装,修改ycsb主目录和mapkeeper ...
- BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列
BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...
- 使用 @RequestMapping 映射请求
- Js常见的六种报错
EvalError: raised when an error occurs executing code in eval() EvalError:当一个错误发生在()执行的代码RangeError: ...