OSI层次:传输层
关键词:可靠性、流控制、 错误校正。
刻画了终端对终端的连接
1. 传输层概述
1.1. 传输层的功能
- 
传输层将上面应用层的数据分段 
- 
建立终端到终端的操作 
- 
将报文段 (segment) 从一台主机端发送到其它主机 
- 
流量控制和可靠性 -  可以比作与外国人对话,通常你让外国人重复他的话(可靠性),然后慢慢的说(流量控制)
 
1.2. 两个重要的协议
1.2.1. TCP (Transmission Control Protocol, 传输控制协议)
 TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF (Internet Engineering Task Force, 因特网工程任务组) 的 RFC 793 定义。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。因此我们需要 TCP 协议做下面几件事:
- 
提供软件的段检查 
- 
如果有丢失或者错误,重新发送 
- 
使用确认 
- 
提供流量控制 
1.2.2. UDP (User Datagram Protocal, 用户数据包协议)
 UDP 是一种面向无连接、不可靠的、快速传输的传输层通信协议,由RFC 768定义。作为Internet传输层的另外一个重要协议,UDP除了给应用程序发送数据包并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。
- 不提供软件检查段
- 不使用确认
- 不提供流操作
1.3. 服务模型
 TCP和UDP都用端口来跟踪同一时间穿过网络的不同通讯。应用软件开发商已经同意使用众所周知的,在RFC 1700中定义的端口号:
- < 255: TCP 和 UDP 公共应用
- 256~1023:公共端口
- 1024~49151:注册端口
- 49152~65535:客户端进程
值得注意的是,IP地址 + 特定的端口号 = 制定的进程
 
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字节长的首部 和 任意长度的数据段
 
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的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
 
- 
RST——占1位 - 复位 RST(ReSeT) = 1 时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
 
- 
SYN——占1位 - 同步 SYN = 1表示这是一个连接请求或连接接受报文
 
- 
FIN——占1位 - 终止 FIN(FINis)—— 用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
 
- 
窗口——占2字节 - 用来让对方设置发送窗口的依据,单位为字节
 
- 
校验和——占2字节 - 检验和字段检验的范围包括首部和数据这两部分
 
- 
紧急指针——占2字节 - 指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
 
- 
选项 - 
TCP 最初只有一种选项,即最大报文段长度 MSS (Maximum Segment Size) 
- 
MSS 告诉对方缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节 
- 
数据字段加上 TCP 首部才等于整个的 TCP 报文段 
 
- 
- 
填充字段:为了使整个首部长度是4字节的整数倍 
2.4. TCP过程
2.4.1. 建立连接
值得注意的是,无论确认多少次,在逻辑上都没办法确认对方已经和自己建立了可靠的连接(如下图的 two-army-problem, 两军悖论 )
但是我们愿意相信网络的连接不至于糟糕到这样的程度()
因此三次握手被认为是已经足够了
 
第一次握手
服务器: 执行最初的 LISTEN 和 ACCEPT,被动地开始监听
客户端: 执行最初的CONNECT, 产生一个 SYN = 1 和 ACK = 0 的TCP段,代表连接请求
 
第二次握手
服务器:检查是否存在服务进程在监听端口。
- 如果没有进程,返回一个 RST = 1 的TCP段
- 如果存在进程,决定拒绝或接受请求
- 如果接受连接请求,发送一个 SYN = 1、ACK = 1 的段
 
 
第三次握手
客户端:发送一个 SYN = 0 和 ACK = 1 的段来确认连接
 
当服务器收到确认,它通知上层应用
 
2.4.2. 数据传输
停止等待协议 (Stop-and-Wait Protocal)
停止等待协议 最简单但也是最基础的数据链路层协议。很多有关协议的基本概念都可以从这个协议中学习到
 
- 
发送一个段之后,暂时地保留一个备份 
- 
每个段和ACK必须有ID 
- 
重发时间一定大于平均运输时间的两倍 (否则将陷入永无止境的重新发送) 
- 
停止和等待协议是一个简单 (但很低效) 的协议 
确认丢失和确认迟到
You are late!
 
2.4.3. 可靠的通讯
ARQ (Automatic Repeat reQuest,自动重新发送请求)
ARQ 是OSI模型中数据链路层的错误纠正协议之一。重新发送的请求是自动发送的,接受者不需要请求重新发送错误的信息。ARQ 包括停止等待 (Stop-and-Wait) 式 ARQ,回退n帧(go-back-n)ARQ,以及选择性重传(selective repeat)ARQ。后两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大时,帧在线路上可以连续地流动,因此又称其为连续ARQ协议。
TCP使用可变大小的连续ARQ协议 (可变大小的滑动窗口协议)
 
 
- 
发送端要发送900字节长的数据,划分为9个100字节长的报文段,而发送窗口确定为500字节 
- 
发送端只要收到了对方的确认,发送窗口就可前移 
- 
发送TCP要维护一个指针,每发送一个报文段,指针就向前移动一个报文段的距离 
 
- 
发送端已发送了400字节的数据,但只收到对前200字节数据的确认,同时窗口大小不变 
- 
现在发送端还可以发送300字节 
 
一个例子:利用可变窗口大小进行流量控制,双方确定的窗口值是400
| 主机A | 主机B | 
|---|---|
| SEQ = 1 | A现在还能发送300字节 | 
| SEQ = 101 | A现在还能发送200字节 | 
| SEQ = 201 | 此时发生丢失 | 
| 允许A再发送300字节 (序号201至500) | ACK = 201,WIN = 300 | 
| SEQ = 301 | A还能发送200字节(序号301至500) | 
| SEQ = 401 | A还能发送100字节(序号401至500) | 
| SEQ = 201 | A超时重发,但不能发送序号500以后的数据 | 
| 允许A再发送100字节(序号501至600) | ACK = 501, WIN = 100 | 
| SEQ = 501 | A已把发送窗口用完(序号501至600) | 
| 不允许A再发送(到序号600的数据都已收到) | ACK = 601, WIN = 0 | 
2.4.4. TCP:释放连接
 
MSL (Maximum Segment Lifetime) 报文最长存活时间
为什么一定要等2MSL?
保证A发送的最后一条确认可以到达B
防止出现任何无效的连接请求段 (在等待2 MSL之后,我们可以保证连接上的所有段都已经消失)
2.5. TCP的有限状态机
 
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 和 可变长度的数据部分
 
4. 应用:NAT和PAT
4.1. NAT
4.1.1. 概念
NAT (Network Address Translation, 网络地址转换) 由RFC1631定义,指的是在IP包首部,用一个地址换另一个地址的过程
实际上,NAT 用来允许被分配私有地址的主机访问因特网
不得不再提到 IP地址分配的问题,如何解决?
保留注册地址
当连接因特网时,增加灵活性
 
4.1.2. NAT类型
- static NAT (静态NAT): 将内部网络的私有IP地址转换为公有IP地址,IP地址对是双射,且是一成不变的
 
- pooled NAT (NAT池): 映射基于先到先服务动态完成
 
- 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地址。通常是注册地址
 
4.1.4. NAT的优点和缺点
优点:因为不是每一个内部主机都需要同一时间访问外部,你可以用一小部分全局独一无二的地址来服务相对大量的私有地址的主机
缺点:一对一映射(如果私有地址空间是a/8,但是公共地址是a/24,同时只能有254台主机访问因特网)
4.2. PAT
4.2.1. PAT如何工作
 
4.2.2. PAT操作
