————————
————————
- 传输层提供的服务
1.1. 功能
1.1.1. 提供应用【进程】之间的逻辑通信(端到端的通信)
1.1.2. 复用和分用
1.1.2.1. 复用是指发送方不同的应用进程都可以使用同一个传输层协议传送数据
分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程
1.1.2.2. 网络层的复用是指发送方不同协议的数据都可以封装成 IP 数据报发送出去
网络层的分用是指接收方的网络层在剥去首部后把数据支付给相应的协议
1.1.3. 对接收到的报文进行差错检测
1.1.4. 提供两种传输协议UDP和TCP
1.2. 传输层的寻址与端口
1.2.1. 端口号
1.2.1.1. 应用进程通过端口号进行标识,端口号长度为16bit,能够表示 65536(2^16)个不同的端口号。端口号只具有本地意义
1.2.1.2. 服务端使用的端口号
1.2.1.2.1. 熟知端口号
1.2.1.2.1.1. 数值为 0~1023, IANA(互联网地址指派机构)把这些端口号指派给了 TCP/IP 最重要的一些应用程序
让所有的用户都知道
1.2.1.2.2. 登记端口号
1.2.1.2.2.1. 数值为 1024~49151。它是为没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA登记,防止重复
1.2.1.2.3.
1.2.1.3. 客户端使用的端口号
1.2.1.3.1. 数值为 49152~65535,由于这类端口号仅在客户进程运行时才动态选择,又称短暂端口号(临时端口)
通信结束后,刚才使用过的客户端口号就不复存在,这个端口号就可以供其他客户进程使用。
1.2.2. 套接字
1.2.2.1. 在网络中采用发送方和接收方的套接宇(Socket) 组合来识别端点。
所谓套接宇实际上是一个通信端点,即 套接字=(主机 IP 地址,端口号)
它唯一地标识了网络中的一个主机和其上的一个应用(进程)
1.3. 无连接服务和面向连接的服务
1.3.1. TCP
1.3.1.1. TCP不提供广播或组播服务
1.3.1.2. 提供一条全双工的可靠逻辑信道
1.3.1.3. 主要适用于FTP、HTTP、TELNET(远程登陆)
1.3.2. UDP
1.3.2.1. 仅在IP之上提供两个附加服务
1.3.2.1.1. 多路复用
1.3.2.1.2. 对数据的错误检查
1.3.2.2. 主要适用于TFTP(小文件传送协议)、DNS、SNMP(简单网络管理协议)、RTP(实时传输协议) - UDP
2.1. 数据报格式
2.1.1.
2.1.1.1. 1)源端口:源端口号。在需要对方回信时选用。不需要时可用全0
2)目的端口:目的端口号。在终点交付报文时必须要使用
3)长度:UDP数据报的长度(包括首部和数据),其最小值是8B(仅有首部)
4)校验和:检测 UDP 数据报在传输中是否有错。有错就丢
该字段是可选的,当源主机不想计算校验和,则直接令该宇段为全0
2.1.2. UDP 首部有 8 个字节,由 4 个字段组成,每个字段的长度都是两个字节
2.2. 优点
2.2.1. 无需建立连接
2.2.2. 无连接状态
2.2.3. 分组首部开销小 8B
2.2.4. 应用层能更好的控制要发送的数据和发送时间
2.3. UDP 是面向报文的。
1、发送方 UDP 对应用层交下来的报文,在添加首部后就向下交付给 IP 层,既不合井,也不拆分,而是保留这些报文的边界
2、接收方 UDP 对 IP 层交上来 UDP 用户数据报, 在去除首部后就原封不动地交付给上层应用进程, 一次交付一个完整的报文。
2.4. 报文不可分割,是 UDP 数据报处理的最小单位
2.5. UDP校验
2.5.1. 在计算校验和时,要在 UDP 数据报之前增加 12 个字节的伪首部, 伪首部并不是 UDP 真正 的首部。
只是在计算校验和时,临时添加在 UDP 数据报的前面,得到一个临时的 UDP 数据报。
对IP数据报的源IP地址和目的IP地址进行了检验 - TCP
3.1. 特点
3.1.1. 1)TCP 是面向连接的传输层协议
2)每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的
3)TCP 提供可靠的交付服务, 保证传送的数据无差错、不丢失、不重复且有序
4)TCP 提供全双工通信,两端都有发送缓存和接受缓存
5)TCP 是面向字节流的
3.2. 数据报格式
3.2.1.
3.2.1.1. 1)源端口和目的端口字段:各占 2 字节
2)序号字段:占 4 字节。数据流中的每一个字节都要编上序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号
3)确认号字段:占4字节,期望收到对方的下一个报文段的数据的第一个字节的序号。 确认号=N,则表明到序号 N-1 为止的所有数据都己正确收到
4)数据偏移(即首部长度):占 4 位,表示首部长度,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远
5)保留字段:占 6 位,保留为今后使用,目前应置为 0,该字段可以忽略不计
6)紧急位 URG: 当 URG=1时, 表明紧急指针宇段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
7)确认位 ACK:只有当 ACK=1时确认号字段才有效。当 ACK=0 时,确认号无效。在连接建立后所有传送的报文段都必须把 ACK 置 1
8)推送位 PSH:接收 TCP 收到 PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
9)复位位 RST:当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
10)同步位SYN:同步SYN=1表示这是一个连接请求或连接接收报文
11)终止位FIN:用来释放一个连接。 FIN=1表明此报文段的发送方的数据己发送完毕,并要求释放传输连接
12)窗口字段:占 2 字节。 它指出了现在允许对方发送的数据量
13)检验和:占 2 字节。 检验和字段检验的范围包括【首部】和【数据】这两部分
14)紧急指针字段:占 16 位,指出在本报文段中紧急数据共有多少个字节 ,紧急数据放在本报文段数据的最前面
15)选项字段:长度可变。最大报文段长度(MSS):TCP 报文段中的数据宇段的最大长度
16)填充字段:为了使整个首部长度是 4 字节的整数倍。
3.2.2. 首部最短为20B,后面4N字节根据需要而增加
3.3. TCP连接管理
3.3.1. 连接的建立
3.3.1.1.
3.3.1.1.1. 1、客户机先向服务器发送一个连接请求报文段。它不含应用层数据,其首部中的 SYN标志位=1。另外,客户机要随机选择一个起始序号 seq=x
2、服务器收到连接请求报文段后,如同意就向客户机发确认,并为该连接分配缓存和变量。其中,SYN 和 ACK =1,确认号宇段的值=x+1,并且服务器随机产生起始序号 seq=y。确认报文段同样不包含应用层数据
3、当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。其中ACK标志位=1,序号字段=x+1,确认号字段 ACK=y+1 , 该报文段可以携带数据,如果不携带数据则不消耗序号
3.3.2. 连接的释放
3.3.2.1.
3.3.3.
3.4. TCP可靠传输
3.4.1. 序号
3.4.1.1. TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号宇段的值则指的是本报文段所发送的数据的第一个字节的序号。
3.4.2. 确认
3.4.2.1. TCP 首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号
3.4.2.2. TCP 默认使用累计确认,即 TCP 只确认数据流中至第一个丢失字节为止的宇节
3.4.3. 重传
3.4.3.1. 超时
3.4.3.1.1. TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期 但还没有收到确认,就要重传这一报文段。
3.4.3.2. 冗余ACK
3.4.3.2.1. TCP 规定每当比期望序号大的失序报文段到达时,发送一个冗余 ACK,指明下一个期待字节的序号
3.4.3.2.2. 当发送方收到对同一个报文段的 3 个冗余 ACK 时,就可以认为 跟在这个被确认报文段之后的报文段已经丢失
3.5. TCP流量控制与拥塞控制
3.5.1. 流量控制
3.5.1.1. 实现
3.5.1.1.1. 在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小
3.5.1.2. 接受窗口
3.5.1.2.1. 接受端维护,接受端当前的接受缓存大小
3.5.1.3. 拥塞窗口
3.5.1.3.1. 发送端维护,发送端根据当前网络的拥塞程度而确定的窗口值
3.5.1.4. 发送窗口
3.5.1.4.1. 由发送端维护,发送端在接收到下一个确认前能够发送的最大字节数
3.5.1.5. 发送窗口=min{接受窗口,拥塞窗口}
3.5.2. 拥塞控制
3.5.2.1.
3.5.2.1.1. 慢开始
3.5.2.1.1.1. 1、先令拥塞窗口 cwnd=1(即一个最大报文段长度MSS)
2、在每收到一个对新的报文段的确认后,将cwnd加1,即增大一个MSS(拥塞窗口加倍)
3.5.2.1.2. 拥塞避免
3.5.2.1.2.1. 发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小,而不是加倍,使 cwnd 按线性规律缓慢增长(即加法增大)
当出现一次超时(网络拥塞)时, 则令慢开始门限 ssthresh 等于当前 cwnd 的一半(即乘法减小)
3.5.2.1.3. •当 cwnd<ssthresh 时,使用慢开始算法
•当 cwnd>ssthresh 时,停止使用慢开始算法而改用拥塞避免算法
•当 cwnd=ssthresh 时,都可以使用(通常做法)
3.5.2.1.4. 当网络出现拥塞时,无论在什么阶段,只要发送方检测到超时事件的发生(没有按时收到确认,重传计时器超时),就要把慢开始门限 ssthresh 设置为出现拥塞时的发 送方 cwnd 值的一半(但不能小于 2)。 然后把拥塞窗口 cwnd 重新设置为 1, 执行慢开始算法
3.5.2.2.
3.5.2.2.1. 快恢复
3.5.2.2.1.1. 当发送端收到连续三个冗余 ACK时, 就执行“乘法减小”算法,把慢开始门限 ssthresh 设置为出现拥塞时发送方 cwnd 的一半。 与慢开始 (将拥塞窗口 cwnd 设置为 1 )不同之处是它把 cwnd 的值设置为慢开始门限 ssthresh 改变后的数值, 然后开始执行拥塞避免算法(加法增大),使拥塞窗口缓慢地线性增大。