计算机网络——第三章、传输层

一、传输层概述

概述

传输层协议为不同主机上的应用进程之间提供了逻辑通信

传输层协议是在端系统中而不是在路由器中实现的。在发送端,传输层将从发送应用程序进程接收到的报文转换成传输层分组,称为传输层报文段。实现的方法(可能)是将应用报文划分为较小的块,并为每块加上一个传输层首部以生成传输层报文段。

然后,在发送端系统中,传输层将这些报文段传递给网络层,网路层将其封装成网络层分组(即数据报)并向目的地发送。

网络路由器仅作用于该数据报的网络层字段。即它们不检查封装在该数据报的传输层报文段的字段。在接收端,网络层从数据报中提取传输层报文段,并将该报文段向上交给传输层。传输层则处理接收到的报文段,使该报文段中的数据为接收应用进程使用。

因特网有两种协议,即TCP,UDP。

与网络层关系

在协议栈中,传输层刚好位于网络层之上。网络层提供了主机之间的逻辑通信,而传输层为运行在不同主机上的进程之间提供了逻辑通信。

两个协议

面向连接的传输控制协议TCP:提供可靠的连接,时延大,适用于大文件

无连接的用户数据报协议UDP:不可靠,时延小,适用于小文件

寻址与端口

逻辑端口/软件端口,端口是传输层的SAP,标识主机中的应用进程。

端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的。

端口号长度为16bit,能表示65536个不同的端口号。

端口号分为:服务端使用端口号(0-1023,熟知端口号,给TCP/IP最重要的一些应用程序)(1024-49151,登记端口号,为没有熟知端口号的应用程序使用的),客户端使用端口号(49152~65535,:仅在客户进程运行时才动态选择)。

在这里插入图片描述在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。

套接字Socket=(主机IP地址,端口号)

二、 多路复用及多路分解

传输层的多路复用与多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。

一个进程有一个或多个套接字,它相当于从网络向进程传递数据和从进程到网络传递数据的门户。将传输层报文段中的数据交付到正确的套接字的工作称为多路分解。

在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层,这叫多路复用。

无连接

通过为UDP套接字分配端口号,可以描述一下UDP的多路复用与多路分解。

假定主机A,一个进程有UDP端口19157,它要发送一个应用程序数据块给位于主机B中的另一进程,该进程具有UDP端口46428。主机A中的运输层创建一个运输层报文段,其中包括应用程序数据、源揣口号(19157)、目的端口号(46428),然后,运输层将得到的报文段传递到网络层。网络层将该报文段封装到一个IP数据报中,并交付给接收主机。

如果该报文段到达接收主机B,接收主机运输层就检查该报文段中的目的端口号(46428)并将该报文段交付给端口号46428所标识的套接字。主机B能够运行多个进程,每个进程有自己的UDP套接字及相应的端口号。当从网络到达UDP报文段时,主机B通过检查该报文段中的目的端口号,将每个报文段定向(分解)到相应的套接字。

一个UDP套接字是由一个二元组来全面标识的,该二元组包含一个目的地址和一个目的端口号。因此,如果两个UDP报文段有不同的源IP地址或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。

面向连接

TCP 套接字和UDP 套接字之间的一个细微差别是,TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来表示。当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。

特别与UDP两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。

web服务器和TCP

考虑一台运行web服务器的主机,例如在端口80上运行一个Apache Web服务器。当客户(如浏览器)向该服务器发送报文段时,所有报文段的目的端口都将为80。特别是,初始连接建立报文段和承载HTTP请求的报文段都有80的目的端口。

然而,连接套接字与进程之间并非总是有着一一对应的关系。事实上,当今的高性能Web服务器通常只使用一个进程,但是为每个新的客户连接创建一个具有新连接套接字的新线程。对于这样一台服务器,在任意给定的时间内都可能有(具有不同标识的)许多连接套接字连接到相同的进程。

如果客户与服务器使用持续HTTP,则在整条连接持续期间,客户与服务器之间同一个服务器套接字交换HTTP报文。然而,如果客户与服务器使用非持续HTTP,则对每一对请求/响应都创建一个新的TCP连接并在随后关闭,因此对每一对请求/响应创建一个新的套接字并在随后关闭。这种套接字的频繁创建和关闭会严重地影响服务器的性能。

三、用户数据报协议:UDP

概述

UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。

UDP的主要特点:

  • UDP是无连接的,减少开销和发送数据之前的时延。
  • UDP使用最大努力交付,即不保证可靠交付。
  • UDP是面向报文的,适合一次性传输少量数据的网络应用。
  • UDP 无拥塞控制,适合很多实时应用。
  • UDP首部开销小,8B,TCP,20B。

应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文。

在这里插入图片描述

报文段结构

在这里插入图片描述长度字段指示了在UDP报文段中的字节数(首部加数据),因为数据字段的长度在一个UDP段中不同于在另一个段中,故需要一个明确的长度。接收方使用检验和来检查在该报文段中是否出现了差错。实际上,计算检验和时,除了UDP报文段以外还包括了IP首部一些字段(在此忽略)。

分用时,找不到对应的目的端口号,就丢弃报文,并给发送方返回ICMP“端口不可达”的出错报文。

UDP校验

在这里插入图片描述
伪首部只有在计算检验和时才出现,不向下传送也不向上递交。

17:封装UDP报文的IP数据报首部协议字段是17。

UDP长度:UDP首部8B+数据部分长度(不包括伪首部)。

在这里插入图片描述
在发送端:

  1. 填上伪首部
  2. 全0填充检验和字段
  3. 全0填充数据部分(UDP数据报要看成许多4B的字串接起来)
  4. 伪首部+首部+数据部分采用二进制反码求和
  5. 把和求反码填入检验和字段
  6. 去掉伪首部,发送

在接收端:

  1. 填上伪首部
  2. 伪首部+首部+数据部分采用二进制反码求和
  3. 结果全为1则无差错,否则丢弃数据报/交给应用层附上出错警告

UDP提供检验和的原因:不能保证源和目的之间的所有链路都提供差错检测。在既无法确保逐链路的可靠性,又无法确保内存中的差错检测的情况下,如果端到端数据传输服务要提供差错检测,UDP就必须在端到端基础上在运输层提供差错检测。这是一个在系统设计中的端到端原则

UDP虽然提供差错检测,却对差错恢复无能为力。

四、传输控制协议:TCP

概述

TCP是面向连接(虚连接)的传输层协议。

每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。

TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。

TCP提供全双工通信:

  • 发送缓存:准备发送的数据,已发送但尚未收到确认的数据
  • 接收缓存:按序到达但尚未被接受应用程序读取的数据,不按序到达的数据

TCP面向字节流:TCP把应用程序交付的数据看成仅仅是一 连串的无结构的字节流。(流:流入到进程或从进程流出的字节序列)

TCP报文段首部格式

在这里插入图片描述
序号: 在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。

确认号: 期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。

数据偏移(首部长度): TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。

六个标志位

  • 紧急位URG: URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
  • 确认位ACK:ACK=1确认号有效,连接建立后所有传送的报文段都必须把ACK置为1。
  • 推送位PSH : PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
  • 复位RST: RST=1时,表明TCO连接有严重错误,必须释放连接再重新建立传输连接。
  • 同步位SYN: SYN=1时,表明是一个连接请求/连接接受的报文。
  • 终止位FIN:FIN=1,表明此报文段发送方数据发送完毕,要求释放连接。

窗口 : 指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。

检验和 : 检验首部+数据,检验时要加上12B伪首部,第四个字段为6。

紧急指针: URG=1时才有意义,指出本报文段中紧急数据的字节数。

TCP连接管理

TCP连接传输三个阶段:连接建立、数据传送、连接释放

TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。

TCP连接建立

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:

  1. 客户端发送连接请求报文段,无应用层数据。
    SYN=1,,seq=x(随机)

  2. 服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
    SYN=1,ACK=1, seq=y(随机), ack=x+1

  3. 客户端为该TCP连接分配缓存和变量,并向服务幕端返回确认的确认,可以携带数据。
    SYN=0,ACK=1, seq=x+1, ack=y+1

在这里插入图片描述

TCP连接释放

参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量) 将被释放。

  1. 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
    FIN=1, seq=u
  2. 服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了(半关闭状态)。
    ACK=1, seq=v, ack=u+1
  3. 服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。
    FIN=1,ACK=1, seq=w, ack=u+1
  4. 客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL (最长报文段寿命)后,连接彻底关闭。

在这里插入图片描述

SYN泛洪攻击

SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN, SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态。

服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存。

TCP可靠传输

传输层使用TCP实现可靠传输。

网络层提供最大努力交付,不可靠传输。

机制:校验,序号,确认,重传

  • 校验:与UDP校验一样,增加伪首部
  • 序号:TCP报文分段,每一段有序号字段。一个字节占一个序号序号字段指的是一个报文段第一个字节序号。
  • 确认:接收端发送的确认号,来确认已经接收到了。TCP默认使用累计确认
  • 重传:TCP的发送方在规定的时间内没有收到确认就要重新发送已发送的报文段。(超时重传)。TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)

在这里插入图片描述

TCP流量控制

TCP利用滑动窗口机制实现流量控制。

通信过程中,接收方根据自己接受缓存的大小,动态的调整发送方的发送窗口大小,即接受窗口 rwnd(接受方设置报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。

在这里插入图片描述

TCP拥塞控制

接收窗口: 接收方根据接受缓存设置的值,并告知给发送方,反应接收方容量

发送窗口: 发送方根据自己估算的网络拥塞程度而设置的窗口值,反应当前网络容量。

一个传输轮次 : 发送了一批报文段并收到它们的确认的时间。

慢启动

当一条TCP连接开始时,常初始置为一个MSS(Maximum Segment Size 最大报文段大小 )的较小值。TCP发送速率起始慢,但在慢启动时期指数增长。

拥塞避免

一旦进人拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半。TCP无法每过一个RTT再将cwnd的值翻番,而是采用了一种较为保守的方法,每个RTT只将cwnd的值增加一个MSS。

快恢复

在快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd 的值增加一个MSS。最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进人拥塞避免状态。如果出现超时事件,快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态。

当丢包事件出现时,cwnd 的值被设置为1个MSS,并且ssthresh的值设置为ewnd值的一半 。
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45605341/article/details/108919925
今日推荐