这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
-
TCP使用字节流传输数据,UDP使用数据报传输数据
-
通过C语言代码实现
fd = socket(AF_INET, 具体协议,0);
- 具体些协议传入
SCOK_STREAM表示TCP协议,SOCK_DGRAM表示UDP协议 fd表示句柄,一个句柄对应计算机内核中唯一一个SOCK结构
- 具体些协议传入
-
TCP和UDP实现数据传输的过程
- 服务端在本地创建一个
socket,并与本主机的特定端口进行bind,随后服务端的进程会监听这个端口的数据,等待客户端的连接请求,处理和相应客户端发来的数据 - 客户端创建
socket - 客户端通过
sendto函数发送数据,服务端通过recvfrom函数接收数据
- 服务端在本地创建一个
-
流量控制针对的是单个连接数据处理能力的控制,即点对点连接中连接双方的传输速度的控制,使得数据传输可以满足双方的速度限制
-
拥塞控制针对的是整个网络环境数据处理能力的控制,是在整个网络的信息高度公路上不同连接共同占据、竞争网络资源时的网络拥塞处理。
-
TCP的流量控制:控制滑动窗口的大小
-
TCP的拥塞控制:TCP会先慢慢试探的发数据,不断加码数据量,越发越多,先发一个,再发2个,4个...。直到出现丢包。
-
TCP的分段机制:为了避免大规模重传,需要将数据分段,最大分段长度
MSS=MTU-40Byte,其中40字节表示TCP头部和IP头部。 -
大部分项目,会在基于UDP的基础上,模仿TCP,实现不同程度的可靠性机制。比如王者农药用的KCP其实就在基于UDP在应用层里实现了一套重传机制。
-
对于UDP+重传的场景,如果要传超大数据包,并且没有实现分段机制的话,那数据就会在IP层分片,一旦丢包,那就需要重传整个超大数据包。而TCP则不需要考虑这个,内部会自动分段,丢包重传分段就行了。这种场景下,其实TCP更快。