计算机网络自顶向下--第三章传输层笔记

1.大纲

第三章传输层的内容主要是:

  • 运输层概览
    • 运输层的基本概念
    • 运输层和应用层以及网络层之间的关系
  • udp协议
  • 可靠传输原理
  • tcp协议
    • tcp的累计确认以及超时重传机制
    • tcp的流量控制
    • tcp连接的建立和释放
    • tcp的拥塞控制

2.基本概念

  • 网络分层结构:tcp/ip 网络体系中有五层,应用层、传输层、网络层、链路层、物理层。其中,在接收方,每一层需要解析底层传来的数据,交付给上层。在发送方,每一层需要接收上层的数据,封装之后交给下层。
  • 套接字:套接字是应用层和传输层之间数据传输的编程接口。一个套接字由ip地址和端口号组成。
  • 端口号:端口号是套接字的组成部分,可以看作是一个数据的出入口。
  • 多路复用和多路分解:在接收方,传输层解析网络层的数据,将数据交给不同的套接字,这个过程叫做多路分解。相对的,在发送方,传输层接收来自不同套接字的数据,封装成数据报交付给网络层,这个过程叫做多路复用。也就是说,多个套接字共同使用传输层的服务。
  • 数据报:传输层的数据单元。
  • 可靠传输:传输层交付给应用层的数据是完整的,按序的,没有差错的数据。
  • 发送窗口:流水线可靠传输协议中,一次最多发送N个报文,这N个报文成为发送窗口。如果把数据报按照发送时间顺序排列在数轴上,发送窗口将数据报分成三类。左边是已经确认的报文,中间是已经发送未确认的报文和未发送的报文,右边是不可用的报文。

3.传输层概览

传输层提供的是不同主机上进程和进程之间的通信服务。这种服务也被称作多路复用和多路分解服务。而网络层提供的服务是主机到主机之间的通信服务。因此,传输层和应用层网络层之间的关系是,传输层通过套接字接收来自应用层的数据,封装成数据报,交付给网络层。在实现上,我们使用源端口号和目的端口号来标识不同主机上的两个进程。

4.udp协议

udp协议是无连接的,不可靠的网络协议。udp只实现了最基本的进程间数据传输,以及简单的差错校验。
udp的报文格式如下:

首部字段包括:源端口号、目的端口号、报文长度字段、校验和
udp协议的特点:

  • 无连接的(没有连接建立的时延)
  • 简单的(固定的首部,只提供了基本的数据传输和差错校验功能)
  • 没有阻塞控制,如果使用udp协议,开发者可以按照他们想要的速率发送数据,不会收到协议的限制

5.可靠传输原理

网络层提供的是尽力而为的服务,网络层并不保证数据的可靠传输。也就是说,在数据的传输过程中,可能会出现比特差错,丢包,数据包乱序到达等现象。因为udp只实现了最基本的进程间数据传输,以及简单的差错校验,所以udp是不可靠的。而在现实世界中,可靠传输的服务是人们需要的。tcp协议就是可靠传输的协议。书中在详细介绍tcp协议之前,首先介绍了如何实现一个可靠传输协议,然后结合可靠传输原理再去分析tcp协议。
我们需要考虑三个问题:

  • 比特差错
  • 丢包
  • 报文失序到达

5.1 rdt1.0 可靠信道传输

考虑最简单的情况,运输层下的信道是完全可靠的,不会出现上述三个问题。
我们做如下假设:

  • 信道是完全可靠的,数据传输没有任何问题。
  • 我们一次只发送一个数据报。
    状态图如下:

    发送方事件:
  • 接收应用层数据,封装成数据报发送
    接收方事件
  • 解析数据报,交付给指定套接字

5.2 rdt2.0 考虑比特差错

如果考虑比特差错的情况,协议需要提供检验差错以及通知发送方重新发送报文的能力。这里引入了确认机制,对发送方发送的每个数据报,接收方都要相应的发送一个确认报文。这里使用ACK表示肯定确认,即报文没有差错,NAK表示否定确认,报文出现了差错。
还要考虑到,发送的确认报文也可能出现bit差错,所以当发送方收到一个否定确认或者出现差错的确认报文,都会重传数据报,接收方收到冗余分组,依然发送确认报文,但是将冗余分组丢弃。
状态图:

发送方事件:

  • 接收应用层数据:计算校验和,生成数据报
  • 接收确认报文:
    • 收到肯定报文,什么都不做
    • 收到否定或者错误报文,重传数据报
      接收方事件:
  • 接收到错误报文:发送否定确认
  • 接收到正常报文:发送肯定确认

5.3 rdt3.0 考虑丢包情况

网络层的传输是有可能丢包的,比如当分组大于路由器的缓存的时候,路由器会将分组丢弃。这里需要考虑到数据报丢失和确认报文丢失,为了解决丢包问题,我们引入定时器。如果超出一定时间没有收到确认报文,就重传数据报并重启定时器。
状态图:

发送方事件:

  • 接收应用层数据:计算校验和,生成数据报,启动定时器
  • 接收确认报文:
    • 收到肯定报文,什么都不做
    • 收到否定或者错误报文,什么都不做,等待定时器超时重传数据报
    • 定时器超时,重传数据报,重启定时器
      接收方事件:
  • 接收到错误报文:发送否定确认
  • 接收到正常报文:发送肯定确认

5.4 流水线可靠传输协议

上面实现的协议的数据报是一个接一个发送的,这种协议称为停等协议。他有一个明显的缺点,就是信道利用率不高。为了提高信道利用率,我们考虑一次性发送多个分组,这样的协议叫做流水线可靠传输协议。
一次发送多个分组需要考虑:

  • 对数据报编号,不然我们不知道接收方的确认包是对哪一个报文的确认
  • 发送方需要维护一个发送窗口,窗口的大小N意味着一次最多同时发送N个数据报
  • 需要考虑报文失序到达的情况

5.4.1GBN协议 回退N步

特点:

  • 一次最多发送N个报文,并且整个窗口公用一个计时器,如果计时器超时,重传所有未被确认的数据报
  • 接收方采用累计确认的方式,没收到一个包,返回连续的最大序号X,这意味着x之前的报文接收方都已经收到了
  • 接收方不缓存数据报,如果收到失序到达的数据报,直接丢弃
  • 发送方每收到一个确认报,都需要更新窗口的baseSeq

5.4.2SR协议 选择重传

如果出现超时情况,GBN会一次重传所有没有确认的分组,这可能存在大量的冗余分组。一种改进的方法是发送方将收到的分组缓存起来,并且,发送方为窗口内每个分组设置定时器。

  • 发送方为窗口内每个分组设置定时器,超时重传
  • 接收方收到分组后,如果是窗口内的分组,缓存下来,发送一个确认报
  • 接收方收到确认报后,观察确认分组需要,如果等于baseseq,更新窗口的baseSeq

6. tcp协议

6.1 tcp概述

tcp的特点:

  • 面向连接的
  • 可靠的
    面向连接指的是tcp协议有建立连接和释放连接的过程,也就是一般说的三次握手和四次挥手。可靠指的是tcp协议保证传输层交付给应用层的数据是完整没有差错并且是有序的。tcp通过累计确认、快速重传、流量控制、拥塞控制来实现可靠传输。

6.2tcp报文格式


重要字段:

  • 序号:报文数据中第一个字节的序号。用来标记报文序号,和前面使用序号标记数据报的作用是一样的
  • 确认号:AB之间,A填写的确认号是期望收到B的下一个数据报的序号字段的值。如果为X,意味着A通知B:X之前的字节都已经收到了
  • 接收窗口:可以发送的最大字节数,用于流量控制
  • 确认标志
    • ACK:用于确认报文
    • SYN:用于连接建立
    • FIN:用于连接释放

6.3 累计确认和快速重传

序号用来标记报文,确认号是期望收到的下一个数据报的序号。如果数据报超时,会重传发送窗口中所有未确认的数据报。如果连续收到三个一样的确认号,可以认为出现了丢包情况,立刻重传对应的数据报,避免出现超时情况引起大量重传。

6.4 流量窗口

如果报文失序到达,接收方需要缓存发送方发送的数据,等到数据都收到后一起上传给应用层。但是缓存的大小是有限制的,如果超过了缓存上限,会出现数据溢出的情况。所以tcp使用接收窗口字段告诉发送方最大能够发送的字节数,发送方发送的字节数不能够超过接收窗口。

6.5 tcp连接的建立和释放

tcp通信之前需要设置tcp相关变量,分配缓存空间,通信结束需要释放缓存,因此需要建立和释放tcp连接。

6.5.1 建立过程

A B两台主机建立连接
A=》B,A向B发送建立连接报文,SYN位设1,生成seq=x
B=》A,B收到建立连接报文,创建tcp连接,分配缓存空间。B向A发送确认报文,SYN位设1,ACK设1,生成seq=y,ack=x+1
A=》B,A收到确认报文,创建tcp连接,分配缓存空间。A向B发送确认报文,SYN位设0(连接已经建立),seq=x+1,ack=y+1。这个数据报可以携带数据

6.5.2 释放过程

A B两台主机
A=>B, FIN=1
B=>A, ACK=1
B=>A, FIN=1
A=>B, ACK=1 等待2msl时间,关闭连接。

6.5.3一些问题

  • 为什么要三次握手?
    一方面,如果两次握手建立连接,如果存在延迟到达的建立请求包,收到后立刻建立连接会造成资源的浪费。另一方面,为了建立可靠连接,通信双方需要交换并确认各自的起始序号,
posted @ 2022-04-06 20:44  少年留不住  阅读(182)  评论(0编辑  收藏  举报