- 网络层与运输层的区别
- 网络层是为主机之间提供逻辑通信
- 运输层为应用进程之间提供端到端的逻辑通信
运输层下层的协议 网络核心等细节几乎都被其屏蔽 我们可以认为只有两个应用进程在一条逻辑通信信道之间进行通信
- 运输层的端口
- 运行在计算机中的进程是用进程标识符来标志的 但是应用程序不应该让计算机来指派它的进程标识符 因为不同计算机上操作系统不同对应的进程标识符格式可能也不匹配 所以我们需要对应用TCP/IP体系的应用进程进行标志 即在运输层使用协议端口号
- 通信的最终目的是把报文输送到对应的端口号由应用程序进行接收
-
TCP/IP运输层端口用1个16位的端口号来标识 0-65535 端口号只是为了标志该计算机应用层中的各个进程
常用的熟知端口
-
当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
而当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道。
不同协议信道对比 运输层的两个主要协议
- TCP协议
-
UDP协议
运输层协议 - TCP传送的数据单位协议是TCP报文段
- UDP传送的数据单位协议是UDP报文
一、 UDP协议:一种无连接协议
- UDP用户数据报和网际层的IP数据报有很大区别
- IP 数据报要经过互连网中许多路由器的存储转发。
- UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。即UDP用户数据报不经过路由器转发
- UDP只在IP的数据报服务之上增加了一点功能
- 复用和分用
- 差错检测
-
UDP的主要特点
- 无连接:发送数据之前不需要建立连接 减少了开销和发送数据之前的时延
- 尽最大努力交付:不保证可靠交付 因此主机不需要维持复杂的连接状态表 收到其他的UDP数据报后也不需要进行回应(ACK
- 面向报文: 对应用层输送过来的报文 既不合并也不拆分 而是保留报文的边界 在添加首部后就向下交付给IP层 UDP一次交付一个完整的报文
- 没有拥塞控制: 网络出现的拥塞不会使源主机的发送速率降低
- UDP报文
- 两个字段 1个首部1个数据
- 首部字段有4个字段 每个字段都是2字节 源端口|目的端口|长度|检验和
- 计算校验和时 会临时把伪首部和UDP数据报连接到一起 伪首部仅仅是为了计算校验和
UDP数据报
二、TCP:一种面向连接的协议
(1) 提供面向连接的服务。
(2) 传送的数据单位协议是 TCP 报文段 (segment)。
(3) TCP 不提供广播或多播服务。
(4) 由于 TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
- 特点
- TCP 是面向连接的运输层协议。
- **每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)。 **
- TCP 提供可靠交付的服务。
- TCP 提供全双工通信。
-
面向字节流
TCP 中的“流”(stream)指的是流入或流出进程的字节序列。
“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。即TCP发送的字节序列是一连串发送过去的字节流 对方在运输层通过TCP报文段中的序列号进行区分
- 注意
1.TCP 连接是一条虚连接而不是一条真正的物理连接。
2.TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的。
3.TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。
4.TCP 可把太长的数据块划分短一些再传送。
5.TCP 也可等待积累有足够多的字节后再构成报文段发送出去。 - TCP连接
- TCP连接的端点:套接字
每条TCP连接都唯一地被通信两端的两个端点所确定
TCP连接
2.可靠传输的工作原理
-
停止等待协议
- 每发送完一个分组就停止发送 等待对方的确认 在收到确认后再发送下一个发送
- 全双工通信的双方既是发送方也是接收方
即A发送M1给B 此时A未收到B的ACK包 停止发送 等到A收到ACK1 才能继续发送
无差错情况
这里有些问题 当B接收M1时检测出了差错 B丢弃了M1 然后什么也不做 而A也不知道B是否接收到M1了(可能还在发送中 于是A B就一直等待 造成了信道资源的浪费 还有一种情况 就是A发送的数据M1在传输过程中丢失了 而A B 都不知情 这时如何保证通信双方都能正确收到数据呢
超时重传
发送方为每一个发送的分组设定一个超时计时器 只要在计时器到期之前收到相应的确认 就撤销该计时器 继续发送下一个分组 - 确认丢失
当接收方发送的ACK包丢失后 发送方并不知道是ACK包丢失了还是数据在传输过程丢失接收方没有收到数据 因此发送方在计时器到期后就要重传数据报 而接收方收到发送方再次发送的数据包后 会有两个行动- 丢弃重复的数据包 不发送给上层应用
- 向发送方发送确认 因为有可能确实没有收到数据
- 确认迟到
当接收方的ACK包在发送方计时器到期后才传输到发送方时 发送方会再次发送一次数据 而接受方会收到重复的数据 先丢弃 然后会再重传一次ACK包 这里接收方收到两次数据 发送方收到两次ACK确认包
- 注意 在发送完一个分组后 必须暂时保留已发送的分组和副本 以备重传
-
连续ARQ协议
这个和滑动窗口有关系 发送方维持的发送窗口:位于发送窗口内的分组都可以连续发送出去 而不需要等到对方的确认
连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
工作原理
对于接收方来说 一般采用累计确认的方式 不必对收到的分组逐个发送确认 而是对按序到达的最后一个分组发送确认 这样表示到这个分组为止的所有分组都已经正确收到了
Go-back-N
如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。
这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的 N 个分组。
- TCP报文段
- 20字节的固定首部
- 源端口 目的端口
- 序号:4字节 TCP连接中传送的数据流中的每一个字节都编上1个序号 序号字段的值指的是本报文段所发送的数据的第一个字节的序号
- 确认号: 4字节 期望收到对方的下一个报文段的数据的第一个字节的序号
- 数据偏移(首部长度): 4位 指出TCP报文段的数据部分起始处距离TCP报文段的起始处有多远 即首部的长度 其单位是32位字(以4字节为计算单位
- 保留字段:6位 保留至以后使用 目前置为0
- URG紧急 :当URG=1时 表明紧急指针字段有效 告诉系统此报文段中有紧急数据 应该尽快传送 紧急数据不进入接收缓冲区而直接交付给进程,余下数据要进入接收缓冲区;URG是处理在前端(收到数据后立马对真正意义上”数据”进行操作,所以说”紧急”
- 确认ACK :当ACK为1时确认字段才有效 为0时确认号无效
- 推送PSH:接收方收到PSH=1的报文段 就尽快地交付接收应用进程 而不再等待整个缓存填满了以后再向上交付
1、TCP在收到PSH置位的报文后,不管后续再有无报文,先将缓存中的提交给应用程序进程。
2、PSH是在处理的后端,告诉内核,不用等待”满了”再递交数据递交到上层。 - 复位RST :RST=1时表示TCP连接中出现严重差错 必须释放连接然后再重新建立运输连接
- 同步SYN:为1表示这是一个连接请求或连接接收报文
- 终止FIN:用来释放1个连接 FIN为1表明此报文段的发送端的数据已经发送完毕 要求释放运输连接
- 窗口:2字节 用来让对方设置发送窗口的依据 单位为字节
- 检验和:2字节 检验范围包括首部和数据部分 在检验时还需要再TCP报文段的前面加上12字节的伪首部
- 紧急指针:URG为1有效 指出本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
- 选项:长度可变 TCP最初只规定了最大报文段长度MSS选项 MSS告诉对方我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节 MSS是TCP报文段中的数据字段的最大长度 数据字段加上TCP首部等于这个TCP报文段 因此MSS=TCP报文段-TCP首部
为什么设置MSS 因为MSS较小 网络利用率降低 MSS应该尽量大 只要保证IP层传输时不需要再分片就行 -
填充字段:为了使这个首部长度是4字节的整数倍
TCP报文段
- TCP可靠传输的实现
- TCP的滑动窗口是以字节为单位的
- 接受方通过发送方发送的TCP报文段中的窗口字段来设置自己的发送窗口
- 发送窗口表示:在没有收到接收方的确认的情况下 发送方可以连续把窗口内的数据都发送出去
- 可用窗口:允许发送但还未发送的字节流
-
只有收到了接受方的ACK确认包 滑动窗口才能向前滑动
滑动窗口-
发送缓存:发送方的应用进程把字节流写入TCP的发送缓存 发送窗口通常只是发送缓存的一部分
发送缓存 -
接收缓存:接收方的引用进程从TCP的接收缓存中读取字节流
接收缓存
发送缓存用来暂时存放:
-
发送缓存:发送方的应用进程把字节流写入TCP的发送缓存 发送窗口通常只是发送缓存的一部分
- 发送应用程序传送给发送方 TCP 准备发送的数据;
- TCP 已发送出但尚未收到确认的数据。
接收缓存用来暂时存放: - 按序到达的、但尚未被接收应用程序读取的数据;
- 不按序到达的数据。










