# Lecture05 - 第四层传输层
第四层运输层主要是实现了主机之间的通信。数据通信是服务于主机上的进程 (Session)。
# 第四层概述
分割上层应用程序数据 (新的数据单元 - 数据段)
建立端到端 (end to end) 的通讯
从一个终端主机向另一个终端主机发送段 segment
(第三层和第二层不进行可靠性检验,第四层完成可靠性检验,接受方认为数据错误,在第四层进行要求重传)
流量控制和可靠性
- 可以比喻为与外国人交谈:通常,您会要求外国人重复他 / 她的话 (可靠性) 并慢声说话 (流量控制)
- 双方主机的网络的处理能力不同,缓存能力不同
- 传输控制协议 (TCP, Transmission Control Protocol)
- 用户数据报协议 (UDP, User Datagram Protocol)
将传出邮件分成多个部分
在目标站重新组合消息
TCP: 可靠 (效率比较低,早期网络应用少,需要可靠性)
- 面向连接
- 软件检查段 segment
- 重新发送丢失或错误的任何内容
- 使用确认机制
- 提供流量控制
UDP: 不可靠
- 无连接
- 不提供段的软件检查
- 不使用确认
- 不进行流量控制
- 直接丢弃错误的报文,而不进行其他操作。
# 服务模型
TCP 和 UDP 都使用端口来跟踪 (track) 同时穿越网络的不同会话
应用软件开发人员已同意使用 RFC1700 中定义的知名端口号
低于 255 的端口号 (0-255) 保留给 TCP 和 UDP 公共应用程序使用。
0-1023 是知名端口,有分发的规范,不应当被随意使用
1024-49151 的端口号进行登记使用,有的是应用程序已经的使用端口号,避免冲突
# 套接字
- 套接字表示为 (IP 地址,端口)
- 每个连接都表示为 (socket source ,socket destination),这是一个点对点全双工通道
- TCP 不支持多播和广播
# TCP
- 可靠传输
- 流控制
- 滑动窗口 (窗口进行通信,一次数据传输是有上限发的,缓存问题,拥塞问题)
- 避免拥塞
- 连接控制
- 建立连接 —— 三次握手
- 断开连接 —— 四次握手
# TCP 数据段格式
# 源端口 目的端口
socket
# 序号
我们从小向大进行使用,如果使用到最大之后,我们会从小再次重新开始分配。
# 确认号
发数据的同时,对对方上一次的传输做确认
# 数据偏移
# 保留
# 标记位 ——URG
比如说按 Ctrl+C 终止程序的信息可能会将 URG 置为 1
# 标记位 ——ACK
# 标记位 ——PSH
根据网络条件调整,正常情况下缓存满了才会传输
# 标记位 ——RST
连接失败
# 标记位 ——SYN
# 标记位 ——FIN
# 窗口
# 检验和
# 紧急指针
# 可选部分
MSS Maximum Segment Size 最大报文段长度
# 填充
# TCP 协议
主机使用网段 (TPDU) 交换数据
每个段都有:
- 首部为 20 个字节 (可选部分除外)
- 0 或更多数据字节 (请求连接的时候)
段的大小必须与 IP 数据包匹配,并且还必须满足底层的需求
- 例如,以太网的 MTU (最大传输单位) 为 1500 字节
- 是面向字节的传输。
每个字节都有一个 32 位序号
# 可靠连接 —— 两军问题
蓝军必须一起攻打才能打败白军
蓝军信息可能被白军篡改或者阻碍
结论:无论通信多少次,都不能有一个完全可信的消息(进入死循环)
# 建立连接
# 第一次握手
- 服务器:执行 LISTEN 和 ACCEPT 原语,并进行被动监视
- 客户端:执行 CONNECT 原语,生成 SYN = 1 和 ACK = 0 的 TCP 段,代表连接请求
# 第二次握手
服务器检查是否存在监视端口的服务进程
- 如果没有任何进程,请使用 RST = 1 回答一个 TCP 段
- 如果存在进程,则决定拒绝或接受请求
- 如果接受连接请求,则发送 SYN = 1 和 ACK = 1 的网段
# 第三次握手
客户端发送一个 SYN = 0 和 ACK = 1 的段以确认连接
# 传输控制
数据传输 —— 停止等待协议
# 可靠通信 ARQ
ARQ (Automatic Repeat reQuest) 自动重传请求:这表示 "重新发送请求" 为自动发送并且接收方无需请求发送方重新发送错误段
# TCP 释放连接
server 持续发完数据
FIN = 1,表示数据处理完成
# 为什么必须等待 2MSL
为了确保 A 发送的最后一个 ACK 可以到达 B
防止出现任何无效的连接请求段
等待 2 MSL 之后,我们可以确保连接上的所有段均已消失
# Tcp 中的计时器
重传计时器:多长时间进行重传
坚持计时器:避免死锁 (WIN = 0 的时候修改 WIN 但是没有办法发送过去):收到 WIN = 0 的时候,开始进行计时,到时间主动询问
保持计时器:
- 发送数据段后,刷新
- 如果到达一定的时间,则再次询问是不是还要保持连接。
- 长期没有数据,和对方协商是否可以终止
时间等待计时器
# TCP 的有限状态机
- 粗线:正常的服务器端
- 虚线:正常客户端
- 细线:异常状态的问题
# UDP
# 概述
为什么我们需要 UDP?
- 没有建立连接 (避免延时)
- 简单:发送方,接收方无连接状态
- 小段 header
- 没有拥塞控制:UDP 可以按照期望的速度传输
无连接:没有复杂控制,头部简单
- UDP 发送方,接收方之间没有握手 (HandShake,包含进程等信息的)
- 每个 UDP 段都独立处理
常用于流媒体 (Stream) 多媒体 (multimedia) 应用
- 容忍损失:无非就是降低帧率
- 这类应用是速率敏感的应用,而不一定是质量敏感的应用。
UDP 用于:
- RIP: 定期发送路由信息 (periodically)
- DNS: 避免延迟建立 TCP 连接 (DNS 需要快速找到)
- SNMP:SNMP:拥塞时 (congestion),SNMP 必须仍然可运行。在没有拥塞和可靠性控制机制的情况下,UDP 在这种情况下的性能要优于 TCP。(主播和多播,大量信息传输)
- 其他协议包括 TFTP,DHCP
# UDP 帧结构
- UDP 的数据段很简单
- UDP 只有 8 个字节的首部
- 源端口、目的端口、长度、校验 (data)、Data
- 校验也要对 data 一并校验,如果出现错误,直接丢弃。
- 应用层进行数据切片,决定如何进行发送,UDP 直接发送
# 应用:NAT 和 PAT
# 什么是 NAT?
- NAT,是在 IP 数据包头中将一个地址交换为另一个地址的过程
- 网络地址转换
- 是网络地址即将用完的解决方案
- 实际上,NAT 用于允许私下寻址的主机访问 Internet。
- IP 地址耗尽的解决方案之一
- 保留注册 (合法) 地址
- 连接到 Internet 时增加灵活性
- RFC 1631 - Network Address Translator (NAT)
# NAT 类型
# NAT 地址类型
# NAT 优缺点
- 优点:由于并非每个内部主机都需要同时进行外部访问,因此您可以使用少量的全局唯一地址池来服务相对大量的私有寻址主机。
- 缺点:一一映射,并没有从根本上解决地址短缺的问题。
- 也就是说,如果专用地址空间为 / 8,但公用地址为 / 24,则一次只能有 254 个主机可以访问 Internet,主要内网不是同时有很多主机上网,就可以如上操作,进一步降低地址压力 (类似并行和穿行的区别)
TCP 不支持多播和广播
**