运输层为运行在不同主机上的应用程序之间提供逻辑通信。
通过运输层协议,两台电脑仿佛直接相连一样。
应用无需知道底层内部实现的原理和细节,比如怎么把远隔世界两地电脑上的数据进行相互传输。
为了做到为不同主机 (host) 上的应用或者说进程提供逻辑通信这一目的,运输层协议必须能分辨出数据的来源和去向。
为此,运输层存在着两种行为,【多路复用】和 【多路分解】。
多路复用:当运输层收到来自上方应用层的数据时,运输层会为数据封上一些头部信息,根据所有协议不同,封上的信息也不一样。
多路分解:当运输层收到下方网络层传输来的数据时,运输层会检查多路复用时封上的信息,从而正确的把数据定向到相应的进程
如何使用运输层的协议?
操作系统提供了被称为socket的接口api供编程人员调用,对socket的形象理解是其是一种抽象,将复杂的实现 (tcp/udp) 协议的各种行为抽形成简单的几个函数给开发人员使用。
就像浏览器将发送请求报文这一http协议规定的行为,抽象成我们只需要输入url然后回车即可。
这里需要注意的一点是:
在一般情况下,一个计算机端口只能被一个进程占用
一个进程可以创建多个Socket,多个TCP Socket可以监听同一个端口,并保证接受的数据依旧是正确的
多个UDP Socket就无法监听同一端口,这其中的差异源于TCP和UDP协议的不同
UDP和TCP的多路复用和分解
Q1:UDP的多路复用和分解
一个UDP Socket通过一个二元组 (目的IP地址,目的端口号) 来标识,当输入层收到数据时,通过检查这个二元组,来定向数据该去往哪一个UDP Socket。这也是多个UDP Socket无法监听同一个端口的原因
Q2:TCP的多路复用分解
一个TCP Socket通过一个四元组 (源IP,源端口,目的IP,目的端口号) 来标识,这也解释为什么多个TCP Socket可以监听同一个端口,尽管目的IP和目的端口号是一样的,但是源IP和源端口的组合总是不同的
参考
Linux | 对于UDP的学习
https://blog.csdn.net/qq_40399012/article/details/85983221
一文遨游运输层
https://mp.weixin.qq.com/s/_mPgRU1JnGDLnbeXB_4f0Q
自顶向下 ,带你遨游运输层
https://www.pianshen.com/article/85921424643/
https://blog.csdn.net/lxw1844912514/article/details/106687469
TCP和UDP为何可以共用同一端口?
https://cloud.tencent.com/developer/article/1746827
计算机网络太难?了解这一篇就够了
https://zhuanlan.zhihu.com/p/385851671