目录
一 传输层概述
任务:
进程之间的通信, 传输层向上面的应用层提供端到端通信服务
复用:
发送方不同的应用进程都可以使用同一个传输层协议传送数据
分用:
接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程
复用分用图:
传输层的逻辑通信:
提供端到端的逻辑通信, 即传输层之间的通信好像是沿水平方向传送数据, 但实际上的两个传输层之间没有一条水平方向的物理连接, 要传送的数据是通过网络层及其以下传送的。
逻辑通信图:
网络层与传输层区别:
网络层提供主机到主机之间的逻辑通信, 而传输层为应用进程之间提供端到端的逻辑通信
区别图:
端口:
端口是应用层与传输层之间接口的抽象, 端口号是应用进程的传输层地址。
端口用16位端口号进行标记, 允许有65535个端口号,分为熟知端口、登记端口、动态端口。
端口号只具有本地意义。不同主机间的相同端口号没有联系。
熟知端口: 其数值为0~1023。由因特网赋号管理局分配给常用的应用层程序固定使用。
如:
登记端口: 数值为1024-49151。不分配也不控制, 可以先IANA注册登记, 防止重复使用。
动态端口: 其数值为49152-65535。留给客户进程选择的临时端口。
二 用户数据报协议 UDP
在IP的数据报服务上增加了端口和差错检测功能。
2.1 特点:
1) 无连接, 减少开销和发送数据前的时延
2) 尽最大努力交付, 即不可靠交付, 但不需要维持许多参数、复杂连接状态表。
3) 没有拥塞控制, 不因拥塞降低发送速率, 适合实时应用。
4) 面向报文, 不对应用层交下来的报文进行划分分组, 因此应用层要交合适大小的报文, 太大,IP传送时需要进行分片, 太小, IP首部相对较大, 都会降低IP层的效率。
5) 支持一对一, 一对多, 多对一, 多对多交互通信。
6) 首部只有8个字节开销, 比TCP至少20个字节是首部要短。
2.2 UDP用户数据报的首部格式
DUP传送的数据单元是用户数据报,首部字段由四个部分组成, 每个部分都是2个字节,共8个字节。
首部字段:
1) 源端口: 源端口号
2) 目标端口: 目标端口号
3) 长度: 用户数据报长度
4) 检验和: 差错检验码, 防止UDP用户数据报在传输中出错
UPD通过二元组(目的IP地址, 目的端口号)来定位一个接收方应用进程, 二元组(源IP地址, 源端口号)来标识一个发送方进程。
一个UDP端口与一个报文队列关联, UDP根据目的端口号将到达的报文加到对应的队列。同一目的地的报文会定位到同一个队列(源IP地址和源端口号并不一定相同)。
接收方UDP收到的报文中端口号不存在, 则丢弃该报文, 并由网际控制报文协议ICMP发送一个"端口不可达"的差错报文给发送方。(可用作测试)
UDP多路分用图:
UDP计算检验和方法:
与IP只检验首部不同, UDP的检验会把首部和数据部分一起检验。
首先将全0放入检验和字段中, 将伪首部及用户数据看成16位的字串,不是偶数个字节, 则加入一个全0字节。而后按二进制反码计算出这些16位字的和, 将此二进制反码写入检验和中。
接收方收到的UDP用户数据报连同伪首部一起, 按二进制反码求这些16位字的和, 无差错时结果为全1, 否则就丢弃这个错误的UDP数据报。
伪首部既不下传, 也不上交, 仅仅是计算检验和。
伪首部的第三个字段为全0, 第四个字段是UDP协议字段, 固定17。
UDP首部字段图:
三 传输控制协议 TCP
3.1 TCP的主要特点
1) 面向连接: 传输数据前, 必须先建立TCP连接
2) 每一条TCP连接只能是点对点的, 即由两个端点的二元组(IP地址, 端口号)唯一标识。
3) 可靠交付的服务, 通过TCP连接传送的数据无差错、不丢失、不重复、按序到达。
4) 全双工通信, 允许通信双方的应用进程在任何时候都能发送数据, 两端都设有发送缓存和接收缓存。
5) 面向字节流, TCP把应用进程交下来的数据块看成是一连串无结构的字节流进行封装发送。
与UDP的端口队列不同, TCP发送缓存和接受缓存都是分配给一个连接的, 而不是一个端口, TCP连接由四元组(源IP、源端口号、目标IP、目标端口号)标识。
TCP连接图:
3.2 TCP报文段的格式
TCP的数据单元是报文段, 首部的前20个字节是固定的, 后面有4N个字节是根据需要而增加的选项。
首部字段:
源端口与目标端口: 各占两个字节,与UDP一样, 用于传输层的复用和分用
序号: 占4个字节, 从0开始到2^32 - 1为止, 可对4GB的数据进行编号。每一个字节都要按顺序编号。整个数据的起始序号在连接建立时约定; 首部中的序号字段值表示本报文段所发送数据的第一个字节序号。
确认号: 占4个字节, 是期望收到对方的下一个报文段的第一个数据字节的序号。如:收到序号为501, 数据长度为200, 则期待收到的下一个数据序号是701。
ACK字段: 置为1时, 确认号字段才有意义
数据偏移: 占4位, 指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。即TCP报文段首都的长度。数据偏移的单位是32位字,(即4字节) 最大表示范围是60字节, 即TCP首部最大长度。
保留: 占6位, 暂不使用。
窗口: 占2个字节, 指示发送方的接受窗口大小。窗口用来控制对方发送的数据量。
检验和: 占2字节, TCP伪首部的第四个字段为TCP的协议号16,其计算与UDP检验和一样。
TCP首部字段图:
四 TCP 的可靠传输
TCP在IP的不可靠的尽最大努力服务的基础上实现了可靠的数据传输服务, 即数据无差错、不丢失、按序不重复。
4.1 数据编号与确认
TCP协议是面向字节的, 一个字节对应一个序号。连接建立时, 双方TCP要各自确定初始序号。报文段中的序号字段值表示该报文中第一个数据字节的序号。
TCP使用的是累积确认, 即确认是对所有按序接收到的数据的确认(已按序收到的数据的最高序号+1)。确认号表示接收方期望下次收到的数据中的第一个数据字节序号。如:已经收到了1~700, 801~1000, 那么发送的确认序号应填入701。
TCP发送一段报文时, 同时会在自己的重传队列中存放这个报文段一个副本, 若收到确认, 则删除此副本。 若在规定时间内没有收到确认, 则重传此副本。
传送数据时顺便把确认信息捎带传送, TCP采用了一种延迟确认机制, 即接收方有数据发送给对方, 则可以捎带确认, 也可能这段时间内又有数据到达, 则可以对这两次到达的数据进行累积确认, 提高效率。
收到重复的报文段, 丢弃的同时要立即发回确认信息。
累计确认示意图:
4.2 滑动窗口
- 落入发送窗口的是允许发送的字节,
- 落在发送窗口外左侧的是已经发送并确认的字节,
- 落在发送窗口右侧的是还不能发送的字节。
- 收到确认后, 发送窗口向右滑动, 直到发送窗口的左沿正好包含确认序号的字节。
- 指针前是已发送的, 指针后是未发送的
滑动窗口图:
TCP的发送窗口是不会变化的, TCP的流量控制和拥塞控制会根据情况动态地调整发送窗口上限值, 从而控制发送数据的平均速率。
窗口与接收缓存的关系图:
接受缓存用来暂时存放:
1) 按序到达, 但尚未被接收应用程序读取的数据
2) 未按序到达, 不能被接收应用进程读取的数据
窗口与发送缓存的关系图:
发送缓存用来暂时存放:
1) 准备发送的数据
2) 已发送但未收到确认的数据
4.3 超时重传机制
TCP发送方每发送一个报文段, 就会为这个报文段设置一个计时器。时间到了但还没有收到确认,就要重传这一报文段。即超时重传。
如果超时时间设置太短, 则很多报文会过早超时, 导致很多报文段的重传, 使网络负荷增大, 设置的过长, 则大量丢失报文段不能被及时重传, 降低传输效率。
显然, 超时重传时间应当比当前往返时间(RRT)要长一些, 由于计算超时重传时间过于复杂, 这里不在细究。
超时重传图:
RTT往返时间公式:
4.4 快速重传机制
一个报文段的丢失会引起发送方连续收到多个重复确认, 快速重传即当发送方一连收到三个重复确认后, 立即重传丢失的报文段。
快速重传示意图:
五 TCP 的流量控制
解决因发送方发送数据太快而导致接收方来不及接收, 使接收方缓存溢出问题
TCP采用接收方控制发送方发送窗口大小的方法来实现, 即在TCP报文段首部窗口字段是当前接收方的接受窗口大小。TCP发送方的发送窗口大小必须小于该值。
可变窗口进行流量控制图:
窗口探测:
为防止当发送方窗口为0, 而接收方发送的窗口更新报文段丢失而导致的死锁状态, 当发送方还有数据发送时, 会周期性地(如: 60s)发送只包含1个字节数据的窗口探测报文段, 以便强制接收方发回确认并通告接收窗口大小。
六 TCP连接管理
TCP是面向连接的议协。TCP连接分三个阶段. 即连接建立, 数据传送, 连接释放。
6.1 TCP的连接建立
三次握手:
客户端进程发出请求报文段, 首部SYN置为1, 同时选择一个序号seq=x, 表明下一个报文段的第一个数据字节的序号是x+1。
服务器进程发回连接确认请求, 在确认报文段中把SYN和ACK都置为1, 确认号是ack=x+1, 同时为自己定义一个序号seq=y;
客户端进程收到连接确认后, 还要向服务器进程给出确认, 同时可携带数据
SYN=1的报文段不能携带数据, 但要消耗一个序号
TCP连接图:
发送第三个报文的原因:
防止服务器接收到旧的连接请求报文段, 而分配资源维持不应该有的TCP连接。
6.2 TCP连接的释放:
主机A把发往主机B的报文段首部FIN置为1, seq=u。主机B收到释放连接通知后, 发出确认号ack=u+1。这样, A到B的连接就释放了, 连接处于半关闭状态。但A仍能接受B发送的数据, 并给出确认。
当主机B不再向主机A发送数据时, 根据以上原理, 但主机A的TCP不能马上释放整个连接, 还要等待一个超时时间才能释放整个连接。因为主机A的确认可能丢失。B在收到A确认时, 才最终将整个连接释放。
上述的连接释放过程是四次握手, 也可以看出两个二次握手。
TCP连接释放图:
6.3 TCP的有限状态机
粗实线表示对客户端进程的正常变迁, 虚线表示对服务进程的正常变迁, 细线表示非典型编程。
TCP的有限状态机图:
6.4 TCP与UDP对比图
7 拥塞控制
防止过多数据注入到网络中, 使网络中的路由器或链路不过载。
7.1 拥塞原因与危害
原因:
受到网络中最大吞吐量制约, 当分组因队列已满(网络拥塞)被抛弃, 将使得该分组在其经过路径中占用的全部带宽资源白白浪费。而重发将导致网络更加堵塞。
危害:
网络拥塞不加控制, 将导致网络吞吐量下载到0, 导致网络无法工作, 即死锁
7.2 TCP的拥塞控制
TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度, 来控制连接发送流量的速率。
拥塞控制比较图:
发现拥塞:
网络发生拥塞时, 路由器就要丢弃分组, 因传输差错而丢弃分组的概率远小于1%, 因此可以通过接收到三个重复确认就能判断分组是否丢失, 或者触发超时重传机制。
控制发送速率:
TCP发送方还维持一个拥塞窗口cwnd。拥塞窗口大小取决于网络的拥塞程度, 动态变化, 与接受方的接受窗口一同影响发送方窗口上限。
发送窗口上限值=Min( rwnd, cwnd )
慢启动:
由小到大, 逐渐增大发送方的拥塞窗口数值,直到发生拥塞
慢启动图:
这里假设忽略接收方窗口影响, 设发送的报文长度都是一个MSS(最大报文长度), 由图可知, 每经过一个RRT(往返时间), 发送方的平均发送速率增加一倍。
当发送拥塞时, 将发生拥塞状态下窗口大小值的一半设置为慢启动门限(ssthresh), 但不能小于2。重新回到慢启动状态。第二次慢启动时, 当cwnd>=ssthresh时, 启动拥塞避免算法。
拥塞避免:
当cwnd>=慢启动门限时, 启动拥塞避免算法, 即拥塞窗口cwnd每经过一个RRT往返时间, 就增加一个MSS大小, 按线性规律缓慢增长,直到发生拥塞。同时修改ssthresh。
慢启动与拥塞避免算法图:
快速恢复:
当发送方收到连续三个重复的ACK确认时, 说明网络还有一定分分组交付能力, 拥塞情况不严重, 直接降为1属于反映过于剧烈。即可以重新设置慢启动门限, 并从慢启动门限开始执行拥塞避免算法。
快速恢复图: