传输层就是在信纸的空白上写上新的“收信人”信息。每一所房子【某一个终端】会配备一个管理员(传输层协议)。管理员从邮差手中接过信,会根据“收信人”,将信送给房子中的某个人。使用端口号(port number)来识别收信人(某个进程)。
传输层协议
- TCP 面向字节流服务
- 面向连接,可靠,有序的协议
- 通过滑动窗口、拥塞控制实现可靠和速度
- 应用层提供的数据是一串无结构的字节流,传输层可以对数据进行分段,数据没有长度限制
- DUP 面向报文服务
- 无连接,不可靠,无序的协议
- 应用层提供的是一系列报文,传输层不对报文进行分割和拼装,报文长度受限制
UDP
面向报文、无连接、差错检验、表示不同应用进程(绕过TCP协议,实现相对简单的快速通信)
协议分析
语法:格式,包括四个控制字段(发送端口、接收端口、长度、检验和)在IP分组的基础上,增加了源和目的端口号、检验和,因此可以解决发送进程和接收进程的标识问题语义:
- 接收端发现UDP数据错误就丢掉
- 有相应端口号对应的进程,把数据交给应用进程
- 没有相应端口号对应的进程,则丢弃数据 没有时序,时序体现报文之间的关联性,而UDP每个报文是独立的
TCP
面向字节流、面向连接、表示不同应用进程、差错控制、拥塞控制
TCP 的连接管理
运输连接有三个阶段:连接建立、数据传输、连接释放
TCP连接:每个连接有四个参数(两个IP 保存在 IP 地址头部,两个端口号 保存在 TCP 头信息,序列号和应答号),内核中的TCP模块生成连接之后,将连接分配给进程使用。
为什么 TCP 是面向连接的:
UDP通讯有四个参数:源IP、源端口、目的IP和目的端口。而TCP通讯至少有有六个参数:源IP、源端口、目的IP和目的端口,以及序列号和应答号。
因此对TCP连接的连接概念可以简单理解成为同UDP通讯相比,用序列号和应答号确定了相互之间的连接特征,来保证数据传输的正确性。 参考网站
TCP 有序可靠通信
- 通过序号保证字节流有序
- 通过确认应答、记时重发 保证数据发送正确(数据错了、顺序错了、重复接收)
- 通过滑动窗口(累计确认)保证传输的效率和实现流量控制
- 保证传递效率 <拥塞控制>
TCP重发:超时重发、快速重发。
在TCP协议中,我们使用连接记录TCP两端的状态,使用编号和分段实现了TCP传输的有序,使用advertised window来实现了发送方和接收方处理能力的匹配,并使用重复发送来实现TCP传输的可靠性。
滑动窗口和累积确认
- 发送方:发送窗口内的分组都可以连续发送不需要等待对方确认
- 接收方:不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认
TCP 拥塞控制 保证网络的传输效率和稳定性
拥塞:指分组交换设备中经过某条链路的流量超出链路的传输能力,使得输出队列缓存中等待输出的报文越来越多,以至于发生输出队列溢出,报文丢弃的情况
解决拥塞的简单办法:控制发送端流量。
确定发生拥塞:TCP报文过程中发生丢失报文、重传定时器溢出、连续接受多个重复确认应答】->需要调整发送端流量。(参考:计算机网络【七】:可靠传输的实现)
拥塞窗口CWND:
慢启动:从小到大逐渐成倍增大拥塞窗口的值。(发送拥塞会设置一个慢开始门限 ssthresh = cwnd /2)
拥塞避免:让拥塞窗口的值缓慢的增大。
快重传:尽早知道个别数据包的丢失。发生数据的丢失连续收到3个重复的确认,发送丢失数据包。
快恢复:设置新的慢开始门限为慢开始的一半,重新拥塞避免。
TCP差错控制与传输网络差错控制之间的关系
- 链路层担负起检错的重责 CRC循环冗余检验(检测数据报的正确性)
- TCP差错控制不能取代传输网络差错控制的原因(检测数据的正确性)
三次握手
- SYN 攻击,服务器保持在 SYN-RECV 状态
两次同部位,两次确认位
我需要链接服务器:同部位 SYN,seq 序号为 x
ok,你可以链接:同部位SYN + 确认位ACK
ok,可以链接真开心:确认位ACK(第三次握手可以携带数据)
SYN 同部位 ACK 确认位
seq 发送了多少的序号
ack 确认了多少序号
- ACK不携带数据不消耗序号。
- SYN不能携带数据,要消耗一个序号。
某端 发送了多少序号,需要等到对方返回 ACK 才可以确定。
为什么需要三次握手:
- 三次握手才可以阻止历史重复连接的初始化(主要原因)(两次握手就建立连接,可能建立的是旧的客户端链接)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免服务器端资源浪费