写在前面
本文来看下TCP和UDP协议。
我们接触这两个协议最多的应该就是在面试中了,经典题目就是"TCP和UDP有什么区别?",而最常得到的答案就是TCP是面向连接的,而UDP是面向无连接的。
那么这里的连接
到底是什么呢?难道真的是有一条物理上的线在那里吗?当然不是,实际上是这样子的,我们知道,TCP想要建立连接,必须经历三次握手的过程,三次握手其实就是在交换数据,而三次握手之后,双方都会将这些TCP协议本身需要用到的数据使用一定的数据结构维护起来,所以连接其实就是使用一定的数据结构保存的数据
,也所以连接其实就是数据了,即连接=数据
。那么UDP为什么是无连接的呢,因为它不需要维护这些数据。使用这些数据来维护交互的状态,也就是在逻辑上连接起来了,而绝非物理上的。
TCP维护连接状态的数据都有哪些呢,比如滑动窗口信息,哪些数据发送了没有ack,哪些数据发送了还没有ack,哪些数据还没有发送等。
其他区别:
TCP提供可靠交付,UDP不是
TCP是面向流的,没头没尾,而UDP是基于数据包的,一个个发,一个个收
TCP有拥塞控制,UDP没有
所以啊,可以总结来看,TCP也是一个服务,而程序分为无状态的服务和有状态的服务,很明显TCP是属于有状态的服务了。相对应的UDP就是一个无状态的服务。
1:UDP
UDP全称,user diagram protocol,即用户数据报协议,是一种无连接协议。
1.1:UDP的头
当机器收到一个包之后,物理层首先会拆掉物理层头部,判断MAC地址是否匹配,如果是匹配则交给网际层,网际层获取头部后,发现IP地址匹配,则交给传输层处理,但是到底是交给哪种传输层协议呢,这里需要看IP头部的具体存放使用的是TCP还是UDP的8位协议信息了,这里假定是UDP,数据到达UDP,UDP怎么知道交给哪个应用程序呢?这就需要端口号了,也就是UDP头的如下信息:
这里也可以看到UDP的头只有8个字节,简单到一塌糊涂。而相比之下TCP的头就要复杂多了。
传输层处理完毕之后,内核的工作也就完成了。接下来只要找到监听了目标端口号
的应用程序,交给其处理就行了。
1.2:UDP适用的场景和实例
1.2.1:网络比较好的内网环境
比如像飞鸽,飞秋等内网的聊天工具。
1.2.2:对时延敏感,且对少少量丢包不敏感应用
比如实时对战游戏,属于分秒必争型的,很多职业玩家,为了进一步降低时延甚至会买专业版的鼠标和键盘。如果是使用TCP,可能为了等待上一个没有到达的包,早就被爆头了。
比如直播场景,视频网站,少量的丢包用户其实是没有感知的,特别是直播追求实时性,已经丢失的包就算等到了其实也没有意义了。
1.2.3:应用本身资源少
比如IOT物联网,设备内部可能只是嵌入了一个很小的操作系统,终端系统资源很少,而TCP需要额外存储一些维护连接状态的数据,协议代价比较大。
1.2.4:广播场景
比如DHCP。就算丢包也所谓,重发就行了。
2:TCP
写在后面
参考文章列表
多知道一点
网络包的单位都有哪些?
网络传输是以包为单位的,二层叫帧,网络层叫包,传输层叫段。我们笼统地称为包。