3.2 多路复用和多路分解
运输层的多路复用和多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。需要强调的是,多路复用和多路分解服务是所有计算机网络都需要的
在接收端,运输层检查这些字段,标识出接收套接字,进而将报文段定向到该报文段。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。
在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,这称之为多路复用
这就像是两个家庭之间相互寄邮件,寄件家庭的爸爸,妈妈和儿子都要寄邮件,而爸爸把大家的邮件收集在一起交给邮差,这就是多路复用,这样免去了每个人都要去找邮差寄件,就如同计算机中的进程不需要独占一条网线一样。而收件家庭的妈妈把全家人的邮件都一起从邮差手里取了回来,分给了其他人,这就是多路分解
为了实现多路复用和多路分解,计算机网络有如下特性
①套接字(Socket)有唯一的标识符。
②每个报文段有特殊字段来指示该报文段所要交付到的套接字。而这些特殊的字段就是源端口号字段和目的端口号字段
端口号就如同门牌号。每个主机就如同一栋大厦,报文段到达了目的主机之后,需要前往对应的端口号,将信息给对应端口号的进程才行
端口号是一个16比特的数,范围在065535之间。01023这个范围的端口号称为周知端口号。是受限的,这些端口号留给比如HTTP或者FTP之类的周知应用层协议来使用的。
在主机上每个套接字(Socket)可以分配一个端口号,当报文段到达主机的时候,运输层检查报文段中的目的端口号。并将其定位到相应的端口号中。然后报文段中的数据通过套接字进入其所连接的进程。
1.无连接的多路复用与多路分解
在Python中只需要一行代码就可以创建一个UDP套接字。
clientSocket = socket(AF_INEF, SOCK_DGRAM)
当用这一种方法创建一个套接字的时候,运输层会自动地为这个套接字分配一个随机的端口号。这个端口号一定是没有被占用的。当然你也可以通过bind()方法指定UDP套接字关联一个端口号
clientSocket.bind(('', 11451))
如果应用程序是一个周知协议的服务器端,那么开发者就必须为其分配一个相应的周知端口。也就是说,通常,应用程序客户端会让运输层自动地分配一个端口号,而服务端会分配到一个特定的端口号。
一个UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP地址和一个目的端口号。因此,两个UDP报文有着不同的源IP/源端口号,但是还是会通过相同的套接字被定向到相同的目标进程。
2. 面向连接的多路复用和多路分解
TCP套接字和UDP套接字之间的一个细微差别是TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)。特别和UDP不同的是,两个具有不同源IP地址或者端口号的到达TCP报文段将会被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
服务器注意到TCP报文段中有个四元组。所以所有目的IP,目的端口号,源端口号,源IP都相同的TCP报文段才会被定向到对应的相同的套接字。来源不同的TCP报文段会被定向到不同的套接字。
服务器主机可以支持很多并行的TCP套接字,每一个套接字和一个进程联系,并且由其四元组来表示每个套接字。