引言
传输层的功能
- 将两个端系统之间的网络层交付服务扩展到运行在端系统上的两个应用层进程之间的交付服务
计算机网络中的基本问题
- 两个实体如何能在可能丢失和损坏数据的媒体上可靠地通信?
- 如何控制传输层实体的传输速率,以避免或从网络中的拥塞中恢复?
复用与分用(Multiplexing and Demultiplexing )
(为什么需要分配端口?)
(结合我们说的任务,我们需要什么技术呢?)
复用与分用 技术将网络层提供的 主机到主机 传递服务扩展为运行在主机上的应用程序的 进程到进程 传递服务
举例说明:邮局送信
(这里更详细的补充一些复用与分用的知识)
当计算机中的传输层从下面的网络层接收数据时,如何将接收到的数据定向到这四个进程中的一个?
接收主机中的传输层实际上并不是直接将数据发送给进程,而是发送给中间 套接字。因为在任何给定的时间,接收主机中可能有多个套接字,所以每个套接字都有一个唯一的 标识符 ,而标识符的格式取决于套接字是UDP还是TCP套接字。
因此,问题转化成为:接收主机如何将传入的传输层段定向到适当的套接字?
传输层段(transport-layer segment)有一组用于 将传入的传输层段定向到适当的套接字 的字段(segment)。比如中间主机从下面的网络层到达的段解复用到上面的进程 P1 或 P2,这就是解复用。
总结:传输层中的接受发送端如何使用这个字段呢?
- 发送端:源主机从不同的套接字收集数据块,用头部信息(稍后将在分用中使用)封装每个数据块以创建段,并将段传递到网络层的工作称为 复用。
- 接收端:传输层检查这些字段以识别接收套接字,然后将段定向到该套接字。将传输层段中的数据传送到正确的套接字的工作称为 分用。
基于上述讨论,我们可以知道传输层多路复用j和分用要求:
(1)套接字有唯一的标识符
(2)每个段都有特殊的字段,指示要向哪个套接字传递段。
这些字段具体是什么?
这些特殊字段如图3.3所示,分别是 源端口号字段 和 目的端口号字段
端口号
端口号为16位,取值范围为0 ~ 65535。
端口号范围从0到1023,称为众所周知的端口号,并且受到限制,这意味着它们保留供众所周知的应用程序协议使用,例如HTTP(使用端口号 80)和FTP(使用端口号 21)。
通常,应用程序的客户端让传输层自动(且透明地)分配端口号,而应用程序的服务器端分配特定的端口号(应用程序开发人员正在实现一个“知名协议”的服务器端)
无连接的复用与分用
UDP套接字
创建:
clientSocket = socket(AF_INET, SOCK_DGRAM)
AF_INET:代表地址(和协议)系列 [1], IPv4 网络协议的套接字类型
SOCK_DGRAM:表示套接字类型 [1],UDP
当以这种方式创建UDP套接字时,传输层自动为该套接字分配一个端口号。
另外我们也可以显示指定端口,在创建套接字之后将特定端口号(比如19157)与UDP套接字关联起来。(套接字必须尚未绑定)
clientSocket.bind(('127.0.0.1', 19157))
(实验演示)
UDP套接字分配流程
假设有主机A,使用UDP端口19157,希望将应用程序数据块发送到主机B中UDP端口为46428的进程。
主机A中的传输层创建了一个传输层段,其中包括应用程序数据、源端口号(19157)和目标端口号(46428)和其他两个值。
然后传输层将产生的字段传递到网络层。网络层将网段封装在IP数据报中,并尽最大努力将网段传递给接收主机。
如果段到达接收主机B,接收主机的传输层测试字段中的目标端口号(46428),并将段发送到由端口46428标识的套接字。
注意,主机B可能运行多个进程,每个进程都有自己的UDP套接字和相关的端口号。当UDP段从网络到达时,主机B通过检查段的目的端口号将每个字段定向(分用)到适当的套接字。
注意:UDP套接字是由一个目的IP地址和一个目的端口号组成的二元组完全识别的。(UDP协议字段内其实并没有目的IP地址,而UDP套接字有,相当于网络层和运输层的中介)。
因此,如果两个UDP段有不同的源IP地址和/或源端口号,但有相同的目的IP地址和目的端口号,那么这两个段将通过相同的目的套接字被定向到相同的目的进程。
源端口的作用
目的端口号能将每个字段定向(分用)到适当的套接字,那么源端口号有什么用呢?
服务器从客户端接收到的段中提取客户端(源)端口号,然后它向客户端发送一个新的段,提取的源端口号作为这个新段中的目的端口号
面向连接的多路复用和分用
TCP套接字
TCP套接字由四元组 (源IP地址、源端口号、目的IP地址、目的端口号) 组成
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName,12000))
和 UDP 最大的区别是在通信前需要建立连接
当运行服务器进程的计算机的主机操作系统接收到目的端口为12000的连接请求段时,它会定位到端口号为12000的等待接受连接的服务器进程。然后服务器进程创建一个新的套接字:
connectionSocket, addr = serverSocket.accept()
尽管 主机C 和 主机A 都有相同的端口,但是服务器B仍然能够正确地对具有相同源端口号的两个连接进行多路复用,因为这两个连接有不同的源IP地址。
问题:
为什么UDP没有(源IP地址)?
无连接传输:UDP
参考文献
[1] https://docs.python.org/3/library/socket.html