OSI层次: 传输层
关键词
可靠性 : 流控制 、 错误校正 、 。 刻画了终端对终端的连接
1. 传输层概述
1.1. 传输层的功能
-
传输层将上面应用层的数据分段
-
建立终端到终端的操作
-
将报文段 (segment) 从一台主机端发送到其它主机
-
流量控制和可靠性
- 可以比作与外国人对话
通常你让外国人重复他的话, 可靠性( ) 然后慢慢的说, 流量控制( )
- 可以比作与外国人对话
1.2. 两个重要的协议
1.2.1. TCP (Transmission Control Protocol, 传输控制协议)
TCP 是一种面向连接的
-
提供软件的段检查
-
如果有丢失或者错误
重新发送, -
使用确认
-
提供流量控制
1.2.2. UDP (User Datagram Protocal, 用户数据包协议)
UDP 是一种面向无连接
- 不提供软件检查段
- 不使用确认
- 不提供流操作
1.3. 服务模型
TCP和UDP都用端口来跟踪同一时间穿过网络的不同通讯
- < 255: TCP 和 UDP 公共应用
- 256~1023
公共端口: - 1024~49151
注册端口: - 49152~65535
客户端进程:
值得注意的是
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311033989.png)
1.4.套接字 (Socket)
关于 Socket 更详细的内容可以查看这篇文章
-
套接字表示为
IP地址:端口号( ) -
每一个连接表示为(套接字来源, 套接字目的), 这是一个点对点的全双工信道
-
TCP 不支持 组播 (多播) 和广播
2. TCP(Transmission Control Protocol)
2.1. TCP中必须解决的问题
-
传输必须是可靠的
-
流量控制
- SLP (Sliding Window Protocal, 滑动窗口协议)
- Congestion Avoidance (拥塞避免)
-
连接管理
-
建立连接
三次握手 (Three Handshakes): -
结束连接
四次挥手 (Four Handshakes):
-
2.2. TCP组成
下图是 TCP 报文段的图示
可以看见
TCP 报文段包括固定的 20字节长的首部 和 任意长度的数据段 ,
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311033890.png)
2.2.1. TCP 协议
-
主机用段交换数据 (TPDU)
-
每个段有:
-
20字节的首部 (不包括可选部分)
-
更多数据字节
-
-
段的大小必须和IP 包匹配
也必须满足底层的需求, - 如
以太网的MTU(Maximal Transfer Unit最大传输单元) 是1500 字节每个字节有一个32位的序号,
- 如
2.2.2. TCP 报文段的首部
-
源端口和目的端口——各占2个字节
-
序号——占4字节
-
运输层以报文为标识单位
第四层以字节为标识单位, -
TCP传送的数据流中的每一个字节都编上一个序号
-
序号字段的值指本报文所发送的数据的每一个字节的序号
-
-
确认号——占4字节
- 表示期望受到对方的下一个报文段的数据的第一个字节的序号
-
数据偏移——占4位
- 即首部长度
- 指出 TCP 报文段的数据起始处距TCP 报文段的起始处的长度
- 单位是 32 位字
以 4 字节为计算单位( )
-
保留——占6位
- 保留为今后使用
目前置为0,
- 保留为今后使用
-
URG——占1位
-
紧急URG = 1时
表明紧急指针字段有效, -
告诉系统此报文字段中有紧急数据
应尽快传送(相当于高优先级的数据),
-
-
ACK——占1位
- ACK = 1时确认号字段有效
- ACK = 0时确认号字段无效
-
PSH——占1位
- 推送PSH(PuSH)—— 接收TCP收到PSH = 1的报文段
就尽快地交付接收应用进程, 而不再等到整个缓存都填满了后再向上交付,
- 推送PSH(PuSH)—— 接收TCP收到PSH = 1的报文段
-
RST——占1位
- 复位 RST(ReSeT) = 1 时
表明TCP连接中出现严重差错, 如由于主机崩溃或其他原因( ) 必须释放连接, 然后再重新建立运输连接,
- 复位 RST(ReSeT) = 1 时
-
SYN——占1位
- 同步 SYN = 1表示这是一个连接请求或连接接受报文
-
FIN——占1位
- 终止 FIN(FINis)—— 用来释放一个连接
FIN = 1 表明此报文段的发送端的数据已发送完毕。 并要求释放运输连接,
- 终止 FIN(FINis)—— 用来释放一个连接
-
窗口——占2字节
- 用来让对方设置发送窗口的依据
单位为字节,
- 用来让对方设置发送窗口的依据
-
校验和——占2字节
- 检验和字段检验的范围包括首部和数据这两部分
-
紧急指针——占2字节
- 指出在本报文段中紧急数据共有多少个字节
紧急数据放在本报文段数据的最前面( )
- 指出在本报文段中紧急数据共有多少个字节
-
选项
-
TCP 最初只有一种选项
即最大报文段长度 MSS (Maximum Segment Size), -
MSS 告诉对方缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节
-
数据字段加上 TCP 首部才等于整个的 TCP 报文段
-
-
填充字段
为了使整个首部长度是4字节的整数倍:
2.4. TCP过程
2.4.1. 建立连接
值得注意的是
无论确认多少次 , 在逻辑上都没办法确认对方已经和自己建立了可靠的连接 , 如下图的 two-army-problem, 两军悖论 ( ) 但是我们愿意相信网络的连接不至于糟糕到这样的程度()
因此三次握手被认为是已经足够了
![Two-Army-Problem](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202211031442601.png)
第一次握手
服务器: 执行最初的 LISTEN 和 ACCEPT
客户端: 执行最初的CONNECT, 产生一个 SYN = 1 和 ACK = 0 的TCP段
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311034942.png)
第二次握手
服务器
- 如果没有进程
返回一个 RST = 1 的TCP段, - 如果存在进程
决定拒绝或接受请求, - 如果接受连接请求
发送一个 SYN = 1, ACK = 1 的段、
- 如果接受连接请求
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311034569.png)
第三次握手
客户端
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311034242.png)
当服务器收到确认
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311034132.png)
2.4.2. 数据传输
停止等待协议 (Stop-and-Wait Protocal)
停止等待协议 最简单但也是最基础的数据链路层协议
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311034504.png)
-
发送一个段之后
暂时地保留一个备份, -
每个段和ACK必须有ID
-
重发时间一定大于平均运输时间的两倍 (否则将陷入永无止境的重新发送)
-
停止和等待协议是一个简单 (但很低效) 的协议
确认丢失和确认迟到
You are late
!
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311034118.png)
2.4.3. 可靠的通讯
ARQ (Automatic Repeat reQuest, 自动重新发送请求)
ARQ 是OSI模型中数据链路层的错误纠正协议之一
TCP使用可变大小的连续ARQ协议 (可变大小的滑动窗口协议)
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035976.png)
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035218.png)
-
发送端要发送900字节长的数据
划分为9个100字节长的报文段, 而发送窗口确定为500字节, -
发送端只要收到了对方的确认
发送窗口就可前移, -
发送TCP要维护一个指针
每发送一个报文段, 指针就向前移动一个报文段的距离,
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035826.png)
-
发送端已发送了400字节的数据
但只收到对前200字节数据的确认, 同时窗口大小不变, -
现在发送端还可以发送300字节
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035389.png)
一个例子
主机A | 主机B |
---|---|
SEQ = 1 | A现在还能发送300字节 |
SEQ = 101 | A现在还能发送200字节 |
SEQ = 201 | 此时发生丢失 |
允许A再发送300字节 (序号201至500) | ACK = 201 |
SEQ = 301 | A还能发送200字节(序号301至500) |
SEQ = 401 | A还能发送100字节(序号401至500) |
SEQ = 201 | A超时重发 |
允许A再发送100字节(序号501至600) | ACK = 501, WIN = 100 |
SEQ = 501 | A已把发送窗口用完(序号501至600) |
不允许A再发送(到序号600的数据都已收到) | ACK = 601, WIN = 0 |
2.4.4. TCP: 释放连接
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035466.png)
MSL (Maximum Segment Lifetime) 报文最长存活时间
为什么一定要等2MSL
保证A发送的最后一条确认可以到达B
防止出现任何无效的连接请求段 (在等待2 MSL之后
2.5. TCP的有限状态机
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035310.png)
3.UDP(User Datagram Protocol)
3.1. UDP概述
3.1.1. 为什么使用UDP
-
不需要建立连接 (建立连接会增加时间延迟)
-
简单: 尽最大努力交付
-
面向报文
首部开销小, -
没有拥塞控制: UDP 可以尽可能快的传输
无视拥堵,
-
3.1.2. UDP的特点
-
无连接:
-
UDP的发送方和接收方不需要握手
-
每个UDP段独立处理
-
-
通常被用于**流多媒体应用 (Streaming Application)**
-
容忍包丢失
-
对速率敏感
-
-
UDP 使用于:
- RIP (Routing Information Protocal, 路由信息协议) : 为了周期性发送路由信息
- DNS (Domain Name System, 域名管理系统) : 避免开始TCP连接时的延迟
但实际上( DNS也有使用TCP的时候, 更详细的内容可以查看这篇文章, ) - SNMP (Simple Network Manage Protocal, 简单网络管理协议) : 当堵塞时
SNMP必须仍然可运行, 没有拥堵和可靠的控制机制时。 UDP比TCP表现得更好, - 其它协议包括TFTP (Trivial File Transfer Protocal, 简单文件传输协议) , DHCP (Dynamic Host Configuration Protocol, 动态主机配置协议)
-
如果必要
在应用层再增加可靠性,
3.1.3. UDP格式
UDP 报文包括 8个字节的header 和 可变长度的数据部分
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311035929.png)
4. 应用: NAT和PAT
4.1. NAT
4.1.1. 概念
NAT (Network Address Translation, 网络地址转换) 由RFC1631定义
实际上
不得不再提到 IP地址分配的问题
如何解决 , ?
保留注册地址
当连接因特网时
增加灵活性 ,
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311036418.png)
4.1.2. NAT类型
- static NAT (静态NAT): 将内部网络的私有IP地址转换为公有IP地址
IP地址对是双射, 且是一成不变的,
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311036795.png)
- pooled NAT (NAT池): 映射基于先到先服务动态完成
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311036870.png)
- NAPT (Network Address Port Translation, 网络地址端口转换) 或者叫PAT (Port Address Translation, 端口多路复用): 用于允许多个因特网用户分享一个单独的内部全局地址
是这三种中最普遍使用的( )
4.1.3. NAT地址类型
local “ global 是相对于端口状态说的 、 local是inside部分可以被路由的 , global是outside部分可以被路由的 , 。 ”
Inside Local address (内部本地地址): 内网IP地址
Inside Global address (内部全局地址): 注册IP地址, 对外部展示的内部地址
Outside Global address (外部全局地址): 由主机所有者分配的IP地址
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311036263.png)
4.1.4. NAT的优点和缺点
优点
缺点
4.2. PAT
4.2.1. PAT如何工作
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311036592.png)
4.2.2. PAT操作
![](https://naturalifica.oss-cn-nanjing.aliyuncs.com/~/Users/wuchentian/SoloLearning/Blog/source/imgs202210311036265.png)