第五章 第四层:运输层 Transport Layer
- 第四层运输层主要是实现了主机之间的通信。
- 数据通信是服务于主机上的进程(Session)
- An overview of layer 4
- TCP (Transmission Control Protocol)
- UDP(User Datagram Protocol)
- An application: NAT and PAT
一、第四层综述
1、第4层执行多项功能:
- 对上层应用数据进行分段(segmenting upper-layer application data)
- 建立端到端(end to end)的运营
- 将段从一个端主机发送到另一个端主机
- (第三层和第二层不进行可靠性检验,第四层完成可靠性检验,接受方认为数据错误,在第四层进行要求重传)
- 流量控制和可靠性
- 可以比喻为与外国人交谈:通常,您会要求外国人重复他/她的话(可靠性) 并慢声说话(流量控制)
- 双方主机的网络的处理能力不同,缓存能力不同
2. 两个特别重要的第4层协议:
- 传输控制协议(TCP, Transmission Control Protocol)
- 用户数据报协议(UDP, User Datagram Protocol)
3. Layer 4: The Transport Layer
- 将传出消息划分为多个段 + 在目标站重新组合消息
- 传输控制协议(TCP):
- 可靠
- 面向连接 Connection -oriented
- 软件检查段
- 重新发送任何丢失或出错的段
- 使用确认 acknowledgments
- 提供流量控制
- 用户数据报协议(UDP):
- 不可靠
- 无连接 connectionless
- 不提供段的软件检查
- (直接丢弃错误的报文,而不进行其他操作)
- 不使用确认
- 不提供流量控制
4. 服务模型
- TCP和UDP都使用端口 port来跟踪(track)同时穿越网络的不同会话
- 应用软件开发人员同意使用在RFC1700中定义的知名端口号。
- 端口号低于255的端口保留用于TCP和UDP公共应用程序。
- 端口号0-255是public的,不可以随意分给其他的进程,如果分发则不符合规范
5. 套接字(Socket, 第四层的单位)
- 套接字表示为(IP地址,端口)。
- 每个连接表示为(源套接字,目标套接字),这是一个点对点的全双工通道。
- TCP不支持多播和广播。
二、 TCP (Transmission Control Protocol)
- 传输控制协议
1. TCP 服务模型
1.1 TCP必须解决的问题
- 可靠传输 Reliable transfer
- 流量传输 Flow control
- 滑动窗口 Sliding window
- 避免拥塞 congestion avoidance
- 连接控制 Connection management
- 建立连接:三次握手
- 断开连接:四次握手
1.2 TCP数据段的格式
1.2.1. 首部情况
- 一行共计4字节,段首在前,固定首部长度为20字节。
1.2.2. 源端口和目的端口
- 源端口和目的端口字段:各占 2 字节
- 端口是运输层与应用层的服务接口
- 运输层的复用和分用功能都要通过端口才能实现
1.2.3. 序号
- 序号字段:占4 字节
- TCP 传送的数据流中的每一个字节都编上一个序号
- 序号字段的值指本报文段所发送的数据的第一个字节的序号
1.2.4. 确认号
- 确认号字段:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号
- 确认对方的数据号(发送同时对上一次传输进行确认)
- 体现出了全双工通信的优点,比如上回收到最后序号是700,那么确认号就是701
1.2.5. 数据偏移
- 数据偏移(即首部长度):占 4 位
- 指出 TCP 报文段的数据起始处距 TCP 报文段的起始处的长度
- (Data部分从什么地方开始算)
- 单位是 32 位字(以 4 字节为计算单位)
- 不满足的话使用填充位保证为4字节的整数倍(保证对齐问题)
1.2.6. 保留
- 保留字段:占 6 位,保留为今后使用,目前置 0
- 也就是说截止到现在也没有使用这部分的字段。
1.2.7. URG
- 紧急 URG = 1 时,表明紧急指针字段有效。
- 告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
1.2.8. ACK
- ACK = 1 时确认号字段有效;
- ACK = 0 时确认号字段无效
1.2.9. PSH(PuSH) 推送
- 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
- 此时将缓存所有部分都传输,而并不是只将这个报文段的信息进行传输。
- TCP在正常条件下并不是立马传输的,首先要缓存满了才发送,其次还有就是要保证网络可信的时候才发送
1.2.10. RST 复位
- ReSeT = 1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
1.2.11. SYN
- 同步 SYN = 1:表示这是一个连接请求或连接接受报文
- (初始的时候才出现)
1.2.12. FIN(FINis) 终止
- 用来释放一个连接。
- FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
- (发送方没有传输数据了)
1.2.13. 窗口
- 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
- 表示可以进行传输的窗口大小是多少。
1.2.14. 检验和
- 检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分
1.2.15. 紧急指针字段
- 紧急指针字段:占16位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
1.2.16. 选项(长度可变)
- TCP 最初只有一种选项,即最大报文段长度 MSS(Maximum Segment Size)
- MSS 告诉对方缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节
- 数据字段加上 TCP 首部才等于整个的 TCP 报文段
1.2.17. 填充字段
- 填充字段:这是为了使整个首部长度是 4 字节的整数倍。
2. TCP协议
- 主机使用**段(TPDU传输层PDU)**交换数据
- 每个段都有:
- 一个20字节的首部(不包括可选部分)
- 0 或更多数据字节(请求连接的时候)
- 段的大小必须与 IP 数据包匹配,并且还必须满足底层的需求
- 例如,以太网的 MTU(最大传输单位)为 1500 字节
- 每个字节 byte 都有一个 32 位的序号seq
2.1 Reliable Connection 可靠连接
- “红蓝两军问题”是一个经典的计算机网络中的死锁(Deadlock)问题,或者说是资源竞争的一个类比。通常是用于阐述一些竞争、阻塞和同步问题。
3. TCP:Establish Connection
第一次握手
- 服务器Server:执行LISTEN和ACCEPT原语,被动监听。
- 客户端Client:执行CONNECT原语,生成一个SYN=1和ACK=0的TCP段,表示连接请求。
- SYN=1:连接请求
- ACK=0:确认号无效
第二次握手
- 服务器:检查是否有服务进程在监听端口
- 如果没有进程,回复一个RST=1的TCP段
- 差错,要重连
- 如果有进程,决定拒绝或接受请求
- 如果接受连接请求,发送一个SYN=1和ACK=1的TCP段
- 连接请求
- 确认号有效
第三次握手
客户端:发送一个SYN=0和ACK=1的TCP段,以确认连接。
服务器:接收到确认后,通知上层应用程序连接已建立。
默认三次握手就认为可靠了,之后就进行数据传输
有时候我们会选择,第三次握手的时候同时携带数据。
- TCP头部中的SEQ(序列号)字段:
- 32位,用来标识当前数据段的序列号。每发送一个数据段时,序列号会根据数据段的大小递增。
- 通过与ACK(确认号)一起使用,确保了数据的可靠性和完整性。
- 此ACK指的是32位的那个
- seq和ack的关系:
- 在三次握手(TCP连接建立过程)中,序列号用于确保双方都准备好建立连接。
- 在数据传输过程中,SEQ标识发送的数据包的顺序,而ACK确认已收到的数据。
- 例如,客户端发送的数据包的SEQ为1000,服务器确认收到后返回ACK为1001,表示它已经成功接收到序列号为1000的数据包。
建立连接实例
- 基本的三次握手用于连接同步Synchronization
- 注意,ACK不占用序列号空间(如果占用,我们将最终确认ACK的ACK!)
4. 数据传输——停止等待协议 Data transfer——stop-and-wait protocol
- 发送段后,暂时保留备份 backup
- 在发送后没有收到确认的时候,要保存备份来重传
- 收到确认的时候,抛弃备份
- 超时计时器:如果对方的应答超过一定时间后则直接进行重发(时间要比正常往返时间稍微长一点)
- 每个segment和 ACK 必须具有 ID
- 重新发送时间必须大于平均传输时间 * 2
- 停止等待协议是一个简单的协议,但是效率很低
5. 数据传输——丢失/延迟 Lost ACK and Late ACK
- 丢失ACK情况:
- 发送方:重新发送一份M1数据段
- 接收方:如果接收到重复的M1数据段,接收方将丢弃重复的数据段。
- 将重新发送ACK,以确认已经接收到的M1数据段。
- ACK迟到情况:
- 发送方:重新发送一份M1数据段
- 接收方:如果接收到重复的M1数据段,接收方将丢弃重复的数据段。
- 将重新发送ACK,以确认已经接收到的M1数据段。
- 发送方收到迟到的ACK不做理会
- 晚到的应答直接丢弃(不做处理)
6. 可靠通信——自动重传请求(ARQ)
- ARQ (Automatic Repeat reQuest)
- 这意味着“重传请求”是自动发送的,接收方无需请求发送方重传出错的数据段。
6.1 连续 ARQ 协议
- 连续 ARQ 协议(Contiguous ARQ Protocol)
- ARQ的工作原理
- 发送方维持发送窗口
- 收到一个确认后,发送窗口向前滑动
- 只可发送发送窗口内的数据
6.2 具体实例
- 发送端要发送 900 字节长的数据,划分为 9 个 100 字节长的报文段,而发送窗口确定为 500 字节。
- 发送端只要收到了对方的确认,发送窗口就可前移。
- 发送 TCP 要维护一个指针。每发送一个报文段,指针就向前移动一个报文段的距离。
- 发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。
- 现在发送端还可发送 300 字节。
- 发送端收到了对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减小到 400 字节。
- 现在发送端最多还可发送 400 字节的数据。
- 利用可变窗口大小进行流量控制,双方确定的窗口值是 400
- WIN:窗口的大小:双方动态协商,收到确认调整窗口
- ACK:是指可以继续发送的数据的位置。
- 为什么 201 在 401 后面发送?超时重传(要超过两倍的平均传输时间后才进行重传)
7. TCP: Release Connection 中断连接
第一次握手:A发起断开连接请求
- 客户端:发送一个FIN=1的TCP段,表示请求中断连接。
- 这表示发送方已经没有数据要发送了,但仍然可以接收数据
第二次握手:B:Ack = 1:允许断开
- 服务器:发送一个ACK=1的TCP段,表示确认接收到中断连接请求.
- 此时,接收方可能还有未发送完的数据,因此连接仍然保持,只是不再发送新的数据,此时我们需要完成之前未处理完成的数据的处理。(这里只是说我已经收到了你请求停止传输的请求)
第三次握手:B:FIN = 1:数据处理完成
- 服务器: 发送一个FIN=1的TCP段, 表示它也没有数据要发送了,准备中断连接
第四次握手:A:ACK=1,确认收到B的断开信息
- 客户端: 发送一个ACK=1的TCP段, 表示确认中断连接. 此时连接正式关闭
汇总
- 在释放连接之前,客户端必须等待2倍的最大报文段生存时间(2MSL)
7. 为什么要等待2MSL
- 确保A发送的最后一个ACK能够到达B
- 防止任何无效的连接请求段出现
- 等待2MSL后,我们可以确保连接上的所有段都已消失
9. TCP的计时器
- 重传计时器
- 坚持计时器
- 作用:用于解决TCP连接中的“零窗口”问题。当接收方的接收窗口为零时,发送方会停止发送数据,并启动坚持计时器。坚持计时器到期后,发送方会发送一个小的探测报文段(窗口探测),询问接收方的窗口大小是否已经更新。
- 目的:防止发送方和接收方在“零窗口”状态下进入死锁。
- 保持计时器
- 作用:用于检测TCP连接是否仍然有效。当一段时间内没有数据传输时,保持计时器会启动,并定期发送探测报文段。如果在多次探测后没有收到对方的响应,连接将被认为已经失效。
- 目的:确保连接的有效性,及时发现和关闭失效的连接,释放资源。
- 时间等待计时器
10. TCP的有限状态机
- 粗线:正常的服务器端
- 虚线:正常客户端
- 细线:异常状态的问题
三、UDP (User Datagram Protocol)
- 用户数据报协议
1. 为什么需要UDP
- 无需连接建立:不需要连接建立过程(比如TCP三次握手,这可能会增加延迟)。
- 简单:发送方和接收方没有连接状态。
- 小的段头部:段头部较小,只有8个字节。
- 无拥塞控制:UDP可以根据需要快速发送数据。
2. 介绍(特点与应用)
- 无连接 Connectionless:
- 无握手:UDP发送方sender和接收方receiver之间没有握手过程。
- 独立处理:UDP中的每个数据报文(Datagram)是独立处理的
- 常用于流媒体应用 streaming multimedia applications:
- 容错:对丢失容忍。loss tolerant
- 速率敏感:对传输速率敏感,而UDP允许尽可能快。rate sensitive
- 流媒体应用eg:音频、视频
- UDP的应用:
- RIP(路由信息协议):定期发送路由信息。
- 由于RIP的数据包较小且定期发送,使用UDP可以避免TCP的连接建立和关闭带来的延迟。
- DNS(域名系统):DNS查询通常使用UDP
- 因为DNS查询通常是短小的请求和响应,且不需要建立连接,使用UDP可以避免TCP建立连接时的延迟。
- SNMP(简单网络管理协议):SNMP用于网络设备的监控和管理
- 尤其是在拥塞的情况下,UDP能够比TCP提供更高的性能,因为TCP在拥塞情况下会出现重传和延迟。
- 其他协议:包括TFTP(简单文件传输协议)、DHCP(动态主机配置协议)等不需要建立可靠连接的协议。
- RIP(路由信息协议):定期发送路由信息。
- 必要时在应用层添加可靠性
- 由于UDP本身不提供可靠性,应用层可以根据需要自己实现数据的可靠性控制。
3. UDP段格式
- UDP 的数据段很简单
- UDP 只有 8 个字节的首部,所以 UDP 报文最少是 8 个字节
- 源端口(Source Port):16位,发送方的端口号。
- 目的端口(Destination Port):16位,接收方的端口号。
- 长度(Length):16位,UDP数据报的总长度(包括头部和数据部分)。
- 校验和(Checksum):16位,UDP数据的校验和,用于检验数据在传输过程中是否出错。校验和覆盖数据部分,如果发生错误,接收方会丢弃数据报。
- 校验也要对 data 一并校验,如果出现错误,直接丢弃。
- 数据:UDP 直接发送,UDP 不会再自己分片了;应用层根据需要决定如何将数据分割成适合传输的大小。
TCP和UDP对比
四、An application: NAT and PAT
1. 什么是NAT(Network Address Translation)
- 定义:NAT(网络地址转换)是将IP数据包头中的一个地址替换为另一个地址的过程。
- 用途:NAT用于允许使用私有地址的主机 访问互联网。
- 解决IP地址耗尽的方案之一:
- 节省注册(合法)地址
- 增加连接互联网的灵活性
- 相关标准:RFC 1631 - 网络地址转换器(NAT)
2. NAT a simple concept
3. NAT 类型
- 静态NAT:Static NAT
- 固定映射:一个内部地址到一个注册地址。
- 动态NAT:Dynamic NAT
- 映射是动态完成的,基于先到先得的原则。
- PAT(端口地址转换/重载): PAT (Overload)
- 使用端口地址转换允许多个内部用户共享一个“内部全局”地址。
4. NAT中的地址类型
- Inside Local address 内部本地地址: 内网IP地址
- Inside Global address 内部全局地址: 注册IP地址, 对外部展示的内部地址
- Outside Global address外部全局地址: 由主机所有者分配的IP地址, 通常是注册地址。
- 内部主机发送报文给网关,网关根据 NAT Table 进行翻译,转换成内部全局地址,然后进行转发
5. Static NAT 例子
- 静态映射:静态NAT通过手动配置,将每个内部私有IP地址固定映射到一个公网IP地址。
- 转换表:NAT设备维护一个静态转换表,记录内部私有IP地址和对应的公网IP地址之间的映射关系。
- 地址转换:当内部主机发起连接请求时,NAT设备根据静态转换表,将内部私有IP地址替换为对应的公网IP地址。
- 固定映射:映射关系是固定的,不会随时间变化,确保每个内部主机始终使用相同的公网IP地址进行通信。
6. Dynamic NAT 例子
- 地址池:动态NAT使用一个公网IP地址池来动态映射内部私有IP地址。
- 请求映射:当内部主机发起连接请求时,NAT设备从地址池中选择一个未使用的公网IP地址,并将其映射到内部私有IP地址。
- 建立映射:NAT设备在内部私有IP地址和选定的公网IP地址之间建立临时映射。
- 释放映射:当连接结束或超时时,NAT设备释放该映射,使公网IP地址返回地址池供其他内部主机使用。
- 先到先得
7. NAT 的优缺点
- 优点:
- 由于并非每个内部主机同时需要外部访问,可以使用一个较小的公网IP地址池来服务相对较多的私有地址主机。
- 缺点:
- 一对一映射 one-to-one mapping。
- 例如,如果私有地址空间是/8,但公网地址是/24,则只有254个主机可以同时访问互联网。
8. PAT 端口地址转换 Port Address Translation
- 一种特殊类型的动态NAT
- 将私有IP地址和公网IP地址映射到不同的端口号来实现多个私有IP地址共享一个公网IP地址。
- 每个私有IP地址的每个连接都通过不同的端口号进行区分。
9. PAT 工作原理
- 端口重载:PAT使用一个公网IP地址,并通过不同的端口号来区分内部主机的连接请求。
- 端口映射:当内部主机发起连接请求时,NAT设备将内部私有IP地址和端口号映射到公网IP地址和唯一的端口号。
- 建立映射:NAT设备在内部私有IP地址和端口号与公网IP地址和唯一端口号之间建立临时映射。
- 转换表:NAT设备维护一个转换表,记录内部私有IP地址和端口号与公网IP地址和唯一端口号之间的映射关系。
- 地址转换:当数据包通过NAT设备时,NAT设备根据转换表将内部私有IP地址和端口号替换为公网IP地址和唯一端口号,反之亦然。
- 释放映射:当连接结束或超时时,NAT设备释放该映射,使端口号返回端口池供其他内部主机使用。
10. PAT 操作
If you like my blog, you can approve me by scanning the QR code below.