TCP/IP
中有两个具有代表性的传输层协议,它们分别是 TCP
和 UDP
。TCP
提供可靠的通信传输,而 UDP
则常被用于让广播和细节控制交给应用的通信传输。总之,根据通信的具体特征,选择合适的传输层协议是非常重要的。
传输层概述
传输层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能。从应用程序角度看,通过逻辑通信,运行不同进程的主机好像直接连接一样,实际上,这些主机也许位于地球的两侧,通过很多路由器及多种不同类型的链路相连。应用进程使用传输层提供的逻辑通信功能彼此发送报文,而无须考虑承载这些报文的物理基础设施的细节。
传输层协议是在端系统中而不是在路由器中实现的,在发送端,运输层将从发送应用程序进程接收到的报文转换为传输层分组,也就是传输层报文段(segment)。实现的方法是将应用报文划分为较小的块,并为每块加上一个传输层收不以生成传输层报文段,然后在发送端系统中,传输层将这些报文段传递给网络层,网路层将其封装成网络层分组(数据报
)并向目的地发送。
网络路由器仅作用于该数据报
的网络层字段,它们并不检查封装在该数据报的传输层报文段的字段,在接收端,网络层从数据报中提取传输层报文段,并将该报文段向上给传输层,传输层则处理接收到的报文段,使该报文段的数据为接收应用进程使用。
传输层和网络层的关系
在协议栈中,传输层刚好位于网络层之上,网络层提供了主机之间的逻辑通信,而传输层为运行在不同主机上的进程之间提供了逻辑通信。 这种差别虽然细微但很重要。
接下来我们用一个家庭类比来分析一下这种差别,有两个家庭,一家位于广州,一家位于西安,每家有6个孩子,他们两家是兄弟姐妹的关系。
他们喜欢写信,每个人每个星期都要互相写一封信,每封信都用单独的信封通过传统的邮政服务传送,因此每个家庭向另一家发送36封信,每一个家庭由最小的孩子,也就是老六负责收发邮件,并将这些信件交到每天家门口来的服务车上。当信件到达到另外一个家庭时,另外一个老六也负责将信件分发到他的兄弟姐妹们。
在这个例子中,邮政服务为两个家庭间提供逻辑通信,邮政服务将信件从意见一家送往另一家,而不是从一个人送往另一个人。那两个老六和兄弟姐妹之间提供了逻辑通信,因此这个家庭的例子是一个非常好的类比:
应用层报文 = 信封上的字符
进程 = 堂兄弟姐妹
主机(端系统) = 家庭
传输层协议 = 两个老六
网络层协议 = 邮政服务
两种传输层协议 TCP 和 UDP
因特网为应用层提供了两种截然不同的可用传输层协议,这些协议一种是 UDP(用户数据协议)
,它为调用它的应用程序提供了一种不可靠的、无连接的服务。另一种是 TCP(传输控制协议)
,它为调用它的应用程序提供了一种可靠的、面向连接的服务。
IP
在开始讲解 TCP
和 UDP
之前,我们首先来对网络层中的 IP
来进行一个简要的了解。
IP
的服务模型是尽力而为交付服务
,这就意味着它尽它 最大的努力
在通信的主机之间交付报文段,但它并不做任何确保。特别是,它不确保报文段的交付,不保证报文段的按序交付,不保证报文段数据中的完整性。
由于这些原因,IP
被称为不可靠服务。
TCP
TCP
的传输层分组被称为报文段,它是面向连接的、可靠的字节流服务。流就是指不间断的数据结构,你可以把它想像成排水管道中的水流,当应用程序采用 TCP
发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。
TCP
为提供可靠性传输,实行 顺序控制
或 重发控制
机制,此外还具备 流控制(流量控制)
、拥塞控制
、提提高网络利用率等众多功能。
TCP
提供可靠数据传输,通过使用流量控制、序号、确认和定时器确保正确地、按序地将数据从发送进程交付给接收进程。这样,TCP
将两个端系统间的不可靠 IP
服务转换成了一种进程间的可靠数据传输服务。
UDP
UDP
是不具有可靠性的数据报协议,细微的处理它会交给上层的应用去完成。虽然它可以确保发送消息的大小,却不能保证消息一定会到达。
即使是出现在网络拥堵的情况下,UDP
也无法进行流量控制等避免网络拥塞的行为。此外,在传输途中即使出现丢包,UDP
也不负责重发。甚至当出现包的到达顺序乱掉是也没有纠正的功能。
如果需要这些细节控制,那么不得不交由采用 UDP
的应用程序去处理。
总结
在这篇文章中仅做了传输层做了简要的解析,在下一篇文章中将会讲解多路复用和多路分解。没有什么特殊情况的话文章会持续关注,React
源码先放一放,不会鸽的……
本文正在参加「金石计划」
原文链接:https://juejin.cn/post/7214699255507435581 作者:Moment