- 作用:在不同主机的应用程序端点之间传送应用层报文(不同主机进程间的逻辑通信)
- 报文段(segment):将应用报文划分为较小的块,并未每块加上一个运输船首部以生成。
-
TCP(Transmission Control Protocol)
-
特点
- 面向连接的可靠的数据传输
- 全双工
-
点对点
- 在单个发送方和单个接收方之间的连接
- 面向字节流
-
TCP可靠数据传输
- 设置定时器,等待确认包
- 快速重传
-
GBN和SR协议的混合体
- 选择确认
-
TCP连接管理
- 建立TCP连接:三次握手,报文段交换
- 关闭TCP连接:四次牵手(这是由TCP的半关闭特性造成的,
因为TCP连接是全双工的,
因此,需要TCP两端要单独执行关闭。)
- 不使用二次握手的原因:可能发生timeout或ACK损坏、丢失,导致服务器分配ESTAB,浪费buffer
-
拥塞控制
-
慢启动
- 当建立新的TCP连接时,拥塞窗口(congestion window,cwnd)初始化为一个数据包大小。
源端按cwnd大小发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量。
- 如果按上述慢启动的逻辑继续下去而不加任何控制的话,必然会发生拥塞
-
拥塞避免
- 如果当前cwnd达到慢启动阀值,则试探性的发送一个segment,如果server超时未响应,
TCP认为网络能力下降,必须降低慢启动阀值,当丢包事件(或收到3个冗余ACK)发生时,
cwnd的值被设置为1个MSS,将阈值记录为cwnd的一半,接下来进入快速恢复
- 快速重传
-
快速恢复
- 快速恢复看作是快速重传的后续处理
- 思考:
拥塞不可避免,单纯增加资源并不能避免拥塞的发生
数据包守恒原则
-
区别
-
TCP
- reliable、in-order、congestion control、flow control、connection
-
UDP
- unreliable、unordered、no-frills extension of best effort、connectionless
-
UDP(User Datagram Protocol)
-
UDP 只在 IP 的数据报服务之上增加了端口和差错检测的功能
-
端口
- 端口是用来标志应用层的进程。
- 端口用一个 16 bit 端口号进行标志。
- 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。
- 0~1023范围的端口号称为周知端口号,它们限制于给周知应用层协议使用(如HTTP、FTP)
-
特点
- 发送数据时不需要建立连接
- 主机不需要维持复杂的连接状态表
- 用户数据报只有8个字节的首部开销
- 没有拥塞控制
- 使用UDP的示例:DNS、NFS、流式多媒体、因特网电话、SNMP、RIP、DHCP
-
UDP检验和(checksum)
- 差错检测过程:
1.发送方的UDP对报文段的所有16bit字相加求和然后对结果进行反码运算(求和时遇到的任何溢出都被回卷,即继续加上去),得到检验和。
2.在接收方,发送方的全部16bit字和检验和加在一起,如果结果全部为1(例如1111111111),则该分组中没有引入差错;如果出现0,则该分组出现了差错
-
多路复用和多路分解
-
多路复用:从源主机的不同套接字中收集数据块
并为每个数据块封装上首部信息从而生成报文段,
然后将报文段传递到网络层
- 要求:
1.套接字具有唯一标识符
2.每个报文段有特殊字段(如源端口号字段和目的端口号字段)来指示该报文段所有交付到的套接字
- 多路分解:将运输层报文段中的数据交付的正确的套接字
- 多路分解接收数据,多路复用发送数据
-
分类
-
无连接(UDP)
- UDP套接字包括一个目的IP地址和目的端口号
- 注意:两个具有相同目的IP地址和目的端口号的UDP报文段定向到相同的目的套接字
-
面向连接(TCP)
- TCP套接字包括源IP地址、源端口号、目的IP地址、目的端口号
- 注意:两个具有不同源IP地址和源端口号的TCP报文段定向到不同的目的套接字
-
可靠数据传输原理
-
停等(stop and wait)协议
- 流程:发送方发送数据,然后等待接收方通过ACK或者NAK反馈
- 缺点:无法判断ACK、NAK是否受损;效率低,浪费资源
- ARQ(Automatic Repeat reQuest自动重传请求)协议,简单理解为发送方发送数据,然后等待接收方反馈,然后再相应发送数据
- 在ACK返回受损的情况下,接收方不知道下面收到的包是重复冗余的,需要序号来区分,1bit空间就足够了,因为一次只发送一个包
- 丢失情况:分组丢失;丢失ACK;过早超时。
-
流水线(pipelining)协议
- 允许发送方发送多个分组而无需等待确认
- 1、必须增加序号范围,因为每个传输的分组(不计重传的)必须有一个唯一的序号,而且也许有多个在传输中的未确认的分组;
- 2、协议的发送方和接收方也许必须缓存多个分组,发送方最低限制应当能缓存那些已发送但没有确认的分组,接收方也许需要缓存那些已正确接收的分组;
- 3、所需序号范围和对缓冲的需求取决于数据传输协议处理丢失、损坏及过度延时分组的方式等。
- 解决流水线的差错恢复有两种基本方法:回退N步和选择重传
-
滑动窗口(sliding window)协议
- 发送方和接收方各有一个缓存数组
每个数组有个两个扫描指针,开头和结尾,一起向后扫描,两者形成一个窗口。
- 发送方存放着:已发生且成功确认包序号、已发送未确认包序号 (已发送已确认包序号序号|已发送未确认包序号)*、未发送包序号;
接收方存放着:已接受包序号、正在接收包序号、未接收包序号。
- 为什么需要设置一个窗口长度,因为流量控制,不能无限制的发送数据包。
- 一般说窗口长度是指发送方的窗口长度,
既是len(已发送未确认包序号 (已发送已确认包序号序号|已发送未确认包序号)*),
而接收方缓存数组对应GBN和SR都有不同表现,因为两者针对差错到达帧由不同的处理方式。
-
回退N步(Go-Back-N,GBN)
- 过程:接收方则是只接受最小的未接受帧,对错序到达帧,都丢弃。
对序号为n的分组的确认采取的是累计确认(cumulative acknowledgment)的方式,
表明在接收方已确认接收到序号n以前(包括n在内)的所有组。
- 缺点:当窗口长度和带宽时延积累都很大时,
一个单个分组的差错就可能引起GBN重传大量分组,许多分组根本就不要重传。
-
选择重传(Selective Repeat,SR)
- SR接收方将确认一个正确接收的分组而不管其是否按序到达的。
错序到达帧将会被缓存直到所有丢失帧(即序号更小的帧)都被接收到,
这时才将这一批帧按序交付给上层。