10分钟理解TCP、UDP 和端口号

前言
在我们开始学习网络编程的时候,我们发现一些名词出现的频率极其高,比如 TCP/IP、UDP、OSI 七层网络模型等 。这肯定不是偶然,因为它们极其重要,才会被人反复提及 。尤其在面试的时候,面试官喜欢把它们拿来,当作考察面试者基础功底的重要环节 。为了不让文章显得冗余,我们今天只谈网络中的 TCP、UDP 和端口
协议、TCP 和 UDP
【10分钟理解TCP、UDP 和端口号】在了解 TCP(Transmission Control Protocol 即传输控制协议) 和 UDP(User Datagram Protocol 即用户数据包协议) 之前,我们先要知道一个名词,即协议 。它到底是什么?它其实就是一套约定成俗的规则 。就像开会的时候,我们达成了一些共识,先开发那个接口,项目什么时候上线等等 。
可以毫不夸张地说计算机网络的构建与发展,奠基石就是各种网络协议 。它们定义了信息通讯的方式,以及如何收发信息等,比如:

  • IP 协议负责将多个包交换网络连接起来,并管理通讯 IP 源地址和目标地址的协议
  • TCP 和 UDP 协议则是位于应用层和 IP 层之间,负责它们之间信息传输的重要协议
 
既然是协议,大家都必须遵守,否则,今天张三定一个协议,李四不同意,他明天再定一个协议,这就乱了套 。因此,不同的大厂和许多公司就联合起来组成一个组织,将这些协议统一规范起来 。你就必须得用这些规定好的协议,否则就无法通信 。这才实现了“地球村”的梦想 。今天无论用什么设备,在世界的任何角落,用哪种国家的语言,都可以很方便地使用网络进行通信
TCP 和 UDP 的特点
用一个不算严谨的说法总结 TCP 就是,女孩子如果遇到 TCP 这样的男生,就嫁了吧 。因为TCP的核心特点就是靠谱 。他的特定包括,面向连接、可靠、基于字节流控制的传输,就像一个管道一样将应用层和 IP 层连接起来
而与之相对应的,UDP 就像二十多岁的浪子 。他们不够可靠,但却充满热情 。一切以效率为先,他们可以马上答应你很多事情,并且愿意立马付出实践 。你这一秒说佛珠浪漫,他不管身处何处,立马搭飞机给你去取,下一秒说想去听周杰伦的演唱会,他立马给你订票 。当然,人的精力和时间都有限,所以就可能出现不可控的意外,比如根本没有足够的钱买门票等 。这和UDP相仿,它提供无连接通信,但不对传送的数据包提供可靠性保证
TCP 和 UDP 的特点总结
10分钟理解TCP、UDP 和端口号

文章插图
 
 
TCP 和 UDP 的使用场景
不同的人,因性格不同,做事的方式也不一样,你不能说这样就一定好,那样就一定不好,对于 TCP 和 UDP 也是一样,在不同的场景中,他们各有各的妙用
比如在开发一个游戏的的程序是,对于玩家登陆账号,因为我们要确保不同的玩家能登陆到自己的账号,这个时候就要应用 TCP 协议 。而对于控制游戏中角色的移动,我们只需根据玩家鼠标的点击移动角色,如果因为小概率的网络问题,对于玩家来说,再次进行角色移动操作即可,成本和风险在可控范围内,因此就可以使用 UDP 协议
我们从以上可以看出,如果是基础服务功能,则最好使用 TCP 协议,保证服务的可靠性 。以确保过程中,每一个网络包能够正确抵达目的地 。而相较于 UDP,程序员则需要自己去进一步做丢包情况和字节传输顺序的处理
可不要因此就觉得 UDP 非常难用,正相反,其实有大量的服务是基于 UDP 协议的 。比如 DNS 解析服务 。每一台电脑访问外网网页,都需要通过 DNS 服务解析域名,从中找到对应的 IP 地址 。这个时候如果 DNS 出了问题,我们其实只需要再一次进行 DNS 寻址查询即可 。唯一的副作用,可能就是有一丁点儿延迟罢了
另一个 UDP 的应用就是 IP 电话,我们常把它称作 VoIP(Voice over IP),它的原理可以简化的理解为,把拨打电话从以往的电话通讯,转移到网络通讯上,类似于我们现在的微信通话 。当你和某人通话的时候,用的就是 UDP,想象一下,其实我们这个时候需要的并不是可靠性,而是实时性 。如果不幸中间有一点信息损失了,比如你妈说:“过年给我把对象带回来,不然就别回来了” 。由于信息损失一部分,像这样——“过年给 把对象带 来,不然 别回 了”,其实我们是可以理解一整句话的意思的 。而如果用 TCP,我们可能说一句话,别人 30 秒之后才能听到,这显然是不能忍受的
因此,我们明白了,在日常的开发过程中,我们应该根据不同的应用场景,选择对应的 TCP 或者 UDP 作为网络传输协议,而不能因为我们对 UDP 不熟悉,就从心理上抗拒它


推荐阅读