计算机网络之运输层 - littleboy12580/learning_python GitHub Wiki
概述
运输层协议为云心在不同主机上的应用进程之间提供了逻辑通信,即运输层协议是在端系统中而不是在网络路由器中实现的;在发送方,运输层将接收到的来自发送应用进程的报文转换成运输层分组(即运输层报文段),然后在发送方端系统中运输层将这些报文段传递给网络层,网络层将其封装成网络层分组(数据报)并向目的地发送;网络路由器仅作用于该数据报的网络层字段,即他们不检查封装在该数据报的运输层报文段的字段;在接收方,网络层从数据报中提取运输层报文段,并将该报文段向上交给运输层;运输层处理接收到的报文段,使得接收方应用进程可应用该报文段中的数据
运输层和网络层的关系
运输层为运行在不同主机上的进程之间提供了逻辑通信,而网络层则提供了主机之间的逻辑通信;运输层协议只工作在端系统,在端系统中,运输层协议将来自应用进程的报文移动到网络边缘(即网络层),但是对有关这些报文在网络核心如何移动不做任何规定,中间路由器既不处理也不识别运输层加在应用层报文的任何信息
运输层协议所能提供的服务受到了底层网络层协议的服务模型的限制。例如若网络层协议不能为两主机之间发送的运输层报文段提供时延和带宽保证,那么运输层协议也不能为两进程之间发送的报文提供时延和带宽保证
不过即使底层网络协议在网络层不提供相关服务,运输层协议也能提供某些服务;例如即使底层网络协议不可靠(例如会使分组丢失、混乱和重复等),运输层也能为应用程序提供可靠的传输服务
因特网运输层概述
因特网中的运输层协议有两种:UDP(用户数据报协议)和TCP(传输控制协议);二者的基本任务是将两个端系统之间IP的交付服务扩展为运行在两个端系统上的进程之间的交付服务,将主机间交付扩展到进程间交付,这被称为运输层的多路复用与多路分解
多路复用与多路分解
概述
进程有一个或多个套接字,它相当于从网络向进程传递数据和从进程向网络传递数据的门户;因此,接收主机中的运输层实际上并没有直接将数据交付给进程,而是通过一个中间的套接字来传递;由于在任何一个时刻接收主机上可能有多个套接字,所以每个套接字都有惟一的标识符;运输层的多路分解和多路复用如下所示:
为了让接收主机将一个收到的运输层报文段定向到合适的套接字,需要在每个运输层报文段设置几个字段;在接收端,运输层检查这些字段并标识出接收套接字,然后将报文段定向到该套接字;将运输层报文段中的数据交付到正确的套接字被称为多路分解;从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层的工作称为多路复用
要求
运输层多路复用的要求如下:
- 套接字有唯一标识符
- 每个报文段有特殊字段(源端口号字段和目的端口号字段)来指示该报文段所要交付的套接字
无连接的多路复用与多路分解
UDP一般使用无连接的多路复用与多路分解;假定主机A中的一个进程具有的UDP端口号为19157,它要发送一个应用程序数据块给主机B中的另一个进程,该进程具有的UDP端口号为46428;主机A中的运输层创建一个运输层报文段,其中包括应用程序数据、源端口号、目的端口号和其他值;然后,运输层将生成的报文段传递到网络层,网络层将该报文段封装到一个IP数据报中,并尽力而为地将报文段交付给接收主机;如果该报文段到达接收主机B,接收主机运输层就检查该报文段中的目的端口号并将该报文段传递给端口号所标识的套接字;由于一个UDP套接字是由一个包含目的IP地址和目的端口号的二元组来标识的;因此若两个UDP报文段有不同的源IP地址或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字定向到相同的目的进程
面向连接的多路复用与多路分解
TCP一般使用面向连接的多路复用与多路分解;TCP套接字是由一个四元组(源IP地址、源端口号、目的IP地址、目的端口号)来标识的;