5.传输层
1. 概述
-
传输层功能:
- 传输层提供进程与进程之间的逻辑通信
- 复用和分用
- 传输层对收到的报文进行差错检测
- 传输层两种协议(TCP,UDP)
-
传输层的两个协议:
-
TCP:
-
传输数据之前必须建立连接,数据传输之后要释放连接。不提供广播,多播服务。可靠带来的开销(确认,流量控制,计时器,连接管理等)
-
特点:可靠,面向连接,时延大,适用于大文件
-
-
UDP:
- 传输数据之前不需要建立连接,收到UDP报文之后不需要任何确认
- 特点:不可靠,无连接,时延小,适用于小文件
-
-
传输层的寻址与端口
-
复用与分用
-
复用:应用层所有应用进程都可以通过传输层再传输到网络层(同一信箱)
-
分用:传输层从网络层收到数据后交付指明的应用进程(信分发给不同人)
-
-
端口
-
端口是传输层的SAP,表示主机的应用进程
-
端口号只有本地意义,不同计算机相同端口号无意义,长度为16bit
-
端口号
-
服务端使用的端口号
熟知:给TCP/IP重要的一些应用程序,让所有用户都知道0~1023
登记:不重要的程序使用1024~49151
-
服务端使用的端口号
仅在用户进程运行时才动态选择49152~65535
-
-
熟知端口号
- FTP(21), TELENT(23), SMTP(25), DNS(53), TFTP(69), HTTP(80), SNMP(161)
-
套接字
- Socket = (主机IP地址,端口号)
-
-
2. 用户数据报协议UDP
-
IP基础上增加的功能
复用和分用,差错检验
-
UDP的主要特点
- UDP无连接,减少了发送数据之前的时延
- UDP不保证可靠交付
- UDP是面向报文的,既不合并,也不拆分,保留报文边界(太大会分片)
- UDP没有拥塞控制,传输很稳定,适合实时应用(丢失太多会纠错,重传)
- UDP支持一多都对的交互通信
- UDP首部开销小,只有8字节,比TCP的20字节还短
-
UDP的首部格式
- UDP首部
- 源端口:需要回信的选用,可有可无
- 目的端口:
- 长度:首部字段+数据字段(可无),最小值是8
- 检验和:检验传输中是否有错
- 伪首部
- 既不向下传送也不向上递交,仅仅为了计算检验和
- UDP首部
-
UDP校验
-
在发送端:
-
填上伪首部
-
全0填充检验和字段
-
全0填充数据部分
-
伪首部+首部+数据部分采用二进制反码求和
(让第一行和第二行做二进制反码运算,所得结果与第三行进行反码运算,最后结果取反,得到校验和)
-
把反码填入检验和字段
-
去伪首部,发送
-
-
在接收端
- 填上伪首部
- 伪首部+首部+数据部分采用二进制反码求和
- 结果为1则无差错,否则在应用层附上出差错警告
-
3. 传输控制协议TCP
-
特点
- 面向连接的传输层协议(建立连接)
- 每一条TCP连接只能有两个端点(一对一)
- TCP提供可靠的交付服务
- TCP提供全双工通信(任何时候可存放数据,发送缓存,接收缓存)
- 面向字节流(应用数据为一连串无结构的字节流)
-
TCP报文首部格式
-
序号(seq)
在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一一个字节的序号。
-
确认号
期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N, 则证明到序号N-1为止的所有数据都已正确收到。
-
数据偏移(首部长度)
TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。
-
六个控制位
- 紧急位URG: URG=1时, 标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
- 确认位ACK: ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。
- 推送位PSH: PSH=1时, 接收方尽快交付接收应用进程,不再等到缓存填满再向上交付
- 复位RST: RST=1时, 表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
- 同步位SYN: SYN=1时, 表明是一个连接请求/连接接受报文。
- 终止位FIN:FIN=1时,表明此报文发送方数据已发完,要求释放连接
-
窗口
指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
-
检验和
检验首部+数据,检验时要加上12B伪首部,第四个字段为6。
-
紧急指针
URG=1时才有意义,指出本报文段中紧急数据的字节数。
-
选项
-
最大报文段长度MSS、窗口扩大、时间戳、选择确认…
-
4. TCP连接管理
- TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。
-
TCP连接的建立
- ROUND 1:
客户端发送连接请求报文段,无应用层数据。
SYN=1,seq=x(随机) - ROUND 2:服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
SYN=1,ACK=1, seq=y(随机), ack=x+1 - ROUND 3:
客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。
SYN=0,ACK=1, seq=x+1, ack=y+1 6u
- ROUND 1:
-
TCP的连接释放
-
ROUND 1:
客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u -
ROUND 2:
服务器端回送一一个确认报文段,客户到服务器这个方向的连接就释放了一一半关闭状态。
ACK=1,seq=v, ack=u+1 -
ROUND 3:
服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。
FIN=1,ACK=1, seq=w, ack=u+1 -
ROUND 4:
客户端回送一一个确认报文段,再等到时间等待计时器设置的2MSL (最长报文段寿命)后,连接彻底关闭。ACK=1,seq=u+1, ack=w+1
-
5. TCP的可靠传输
- 可靠:保证接收方进程从缓存区读出的字节流与发送方的字节流一致
-
校验
- 与UDP校验一样,增加伪首部
-
序号
-
一个字节占一个序号
-
序号字段指的是一个报文段第一字节的序号
-
-
确认
- TCP默认使用累计确认
-
重传
-
确认重传不分家,TCP的发送方在规定时间内没有收到确认就要重传已发送的报文段
-
TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)
-
冗余ACK:当期望值序号大的失序报文段到达时,指明期待小的字节序号
-
6. TCP的流量控制*
- 流量控制:让发送方的发送速率不要太快,要让接收方来得及接收
-
序号seq:你可以从1开始发送
-
确认号ack:期望收到对方下一个报文段的第一个数据字节的序号
-
确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。
-
接收窗口rwnd:发送方的发送窗口不能超过接收方给出的接收窗口的数值
TCP的窗口单位是字节,不是报文段
7. TCP的拥塞控制*
-
出现拥塞的条件:对资源需求的总和>可用资源
-
拥塞控制:防止过多的数据注入到网络中
-
假定
数据单方面传输,对方指发送确认报文
接收方有足够大的缓存空间
-
发送窗口
发送窗口=min{接收窗口rwnd,拥塞窗口cwnd}
2. 拥塞控制的方法
-
慢开始与拥塞避免
-
快重传与快恢复