3.1 传输层协议 Transport-layer services
传输层服务和协议
传输层负责再不同主机上的进程进行逻辑通信。简单来说就是主机之间可以直接发送报文,而无需考虑物理设施的搭建。
传输协议行为
发送端:将报文转换成传输层分组(segment),也就是把完整的报文分成小块,并传送给网络层
接收层:网络层提取分组,并将其上传给传输层,再由传输层将其还原为报文
在进行传输时,TCP和UDP两种协议能够发挥作用
传输层和网络层的关系
下面用一个例子解释网络层和传输层的关系
假设我们拥有:
1. 分隔两地的多个家庭
2. 两个地区之间使用邮件交流
3. 两个地方分别有一名家庭成员负责向本地的家庭收取信件,将打包好的信件传给邮递员,并再接收信件以后分发给本地的这些家庭
那么,类比到网络服务,邮递员为两地的家庭之间提供逻辑通讯,两地的收发信件负责人给本地的其他成员提供逻辑通讯(他们两个人就是其他人眼里的邮递员)
于是,得到以下类比:
报文:信的内容
进程process:写信的人
主机 host:家庭
运输层协议:两个负责人
网络层协议:邮政服务(包括邮车)
也就是说,传输层协议负责于进程通讯,网络层协议负责主机间通讯
继续这个类比,负责人和邮递员可以更换,这也就是协议为什么可以进行更替
因特网传输层概述
细化双端行为
继续深化发送端和接收端的行为概览
发送端:
发送报文,决定发送报文的头部域名,建立报文段并且向目标IP地址发送报文
接收端:
从IP获取报文
检查头部域名值
提炼应用层信息
通过socket多路分解消息
TCP和UDP特性简述
TCP
提供可靠数据传输,通过使用流量控制,序号,确认和定时器确保正确并且按序地交付进程
此外,TCP还提供阻塞控制,保证链接平等地共享带宽
UDP
提供不可靠,无连接的服务。不能调节流量,进程可以以任意流量传输消息。因此,不提供可靠和带宽的控制
3.2 多路复用和分解Multiplexing and demultiplexing
以下将在因特网环境下讨论多路复用和多路分解问题(这是所有网络都应用的技术,只是为了方便理解)
上图体现了多路复用的一个典型应用场景。假如用户正在下载Web页面,同时还运行着个FTP会话和2个telnet会话,这样就有四个进程正在运行。当运输层向网络层接收数据之后,它需要定向传输给上述四个进程中的一个
实际上,传输层并不会直接将数据交给进程,而是交给一个中间套接字。套接字的格式决定他们根据TCP还是UDP协议传输
在接收端,每个运输层报文段都会具有几个字段。运输层检查这些字段,标识接收套接字,并将报文段定向到套接字。这种交付到正确套接字的过程就是多路分解
对应的,从不同套接字收集数据段块,加装首部信息,生成报文段传递到网络层的过程就是多路复用
多路分解的工作方式
根据前文,可以知道多路复用需要的要求:
1. 套接字有唯一标识符
2. 每个报文段具有特殊字段指示要交付的套接字
上图展示了端口字段的基本格式。这些字段有:源端口号字段,目的端口号字段,其他首部字段以及报文。
端口号16位,大小在0-1024之间称为周知端口号,指的是他们保留给HTTP和FTP之类的周知应用层使用
无连接的多路复用&多路分解
使用如下代码创建套接字:
clientSocket = socket(AF_INET,SOCK_DGRAM)
这样创建套接字时,系统自动为套接字分配端口号。另一种方法为在创建套接字之后增加bind代码,使得套接字关联特定的端口号
clientSocket.bind('',19157)
如果服务器使用周知协议,那么就必须分配一个周知端口号。通常应用程序的客户端让运输层自动分配端口号,而服务器端则配备特定的端口号
下面用一个例子体现端口号在多路复用中的使用:
1. 主机A中一个进程具有端口19157 要发送给具有端口46428的B主机
2. A创建具有源端口号19157 目的端口号46428的报文段,之后由网络层封装在一个IP数据报中传送给B
3. 接收主机运输层协议检查目的端口号,并将其发送给响应套接字
对于源端口号来说,如果B主机上的端口要对A回复时,则使用A的源端口号作为其目的端口号
面向连接的多路复用&多路分解
TCP套接字与UDP不用,它是一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)
因此,当报文段到达主机之后,主机使用全部4个值进行定向分解。两个具有不同IP地址/端口号的报文将会被分配到不同套接字