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