当一个应用想要和另一个应用通信时,它需要告诉计算机消息应该发送到哪个应用。为了做到这一点,每个应用都会被分配一个端口号,就像是门牌号一样。在互联网中,这些门牌号被称为端口(port)。
当用户需要与其他用户进程通信时,它们不知道对方的地址。所以有一个特殊的进程叫做端口映射器。用户首先与端口映射器建立连接,然后发送一个消息,说自己要什么服务,端口映射器会返回相应的地址。
新服务创建时,会向端口映射器注册,告诉它自己的名字和地址,这样端口映射器就知道了哪个服务对应哪个地址。
端口映射器的功能就类似于电话系统中「查号操作员」,它提供的是名字到电话号码之间的映射关系。
比如,有个人想要通过银行转账,他先跟银行建立连接,然后告诉银行要把钱转到哪个账户。不过,有时候数据包会走错路,或者发送的时候网络太慢,导致发送端以为消息没送到,就又发了一次。这次,消息走了更短的路,很快就到了接收端,于是发送端就结束了连接。
不幸的是,之前的消息会在网络中冒出来,到达接收端,让银行以为是新的请求。银行没法知道这其实是之前的请求,所以又转了一次钱。
为了避免这种情况,我们要设定一个消息的「保质期」,我们不允许数据包在网络中无限期地生存下去,需要设计一种机制来丢掉已经过时的数据包。
比如在互联网上,通常规定一个消息的最长等待时间是 120 秒。如果超过了这个时间,我们就可以放心地丢掉这个消息了,不用再担心它会冒出来搞乱事情。
对于某些应用场景来说,120秒可能会被认为太长了。在某些实时性要求高的应用中,如在线游戏或实时通信应用,120秒的等待时间可能会被视为过长,因为在这么长的时间内,用户可能已经感受到了明显的延迟。
对于一些需要更快速响应的应用,可能会选择更短的超时时间,以便及时发现和处理网络问题。通常,超时时间的选择取决于具体的应用需求、网络性能以及对可靠性和实时性的权衡考虑。
有一个著名的实验是两军对垒问题,一支白军被困在一个山谷中,两旁的山上都是蓝军,白军的实力超过了两旁任何一支蓝军单独的力量,但是两支蓝军合起来的实力却超过了白军。
如果任何一支蓝军单独发起进攻,他将被白军击败,如果两支蓝军同时发起攻击,他们会取得胜利,两支蓝军,希望同时能够发动攻击,然而他们唯一的通信介质就是让士兵穿过山谷传递消息,而在穿越山谷的时候,士兵可能会被白兵抓住,从而丢失信息。假设蓝军 1 号的指挥官发送这样一条消息,我们将在 2 月 10 日黎明时分发起进攻怎么样?现在假设消息已经传到了蓝军 2 号,2 号指挥官同意了,他把信息安全的送回到了蓝军 1 号,进攻会如期举行吗?不会。因为蓝军 2 号指挥官,不知道他的回信是否能够送到,如果回信没有送过去,蓝军 1 号将不会发动进攻,所以对他来说,贸然发动进攻是十分愚蠢的。通过上述实验,我们可以认识到通信中「协议」的重要性。UDP 和 TCP 是两种常见的传输层协议,它们各自具有不同的特点和适用场景。UDP 协议主要注重传输的效率和速度,但并不保证数据的可靠性和顺序传输。在一些对传输延迟要求较高、对数据准确性要求不那么严格的应用场景下,如实时音视频传输、在线游戏等,UDP是一个很好的选择。而 TCP 协议则更加注重数据的可靠性和完整性,它提供了可靠的、面向连接的数据传输服务,通过序号和确认机制确保数据的顺序和完整性。在一些对数据准确性要求较高、需要确保数据可靠传输的应用场景下,如文件传输、网页访问等,TCP 是更为合适的选择。
内容优化:ChatGPT
图片来源:Pixabay
内容来源:《计算机网络》
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34620.html