TCP&UDP的区别
TCP:面向连接的、可靠的、字节流服务
UDP:无连接、不可靠、数据报服务
字节流服务:发送数据的次数与接收数据的次数没有关系。底层数据发送或接收时,数据有可能被分开或者合并(接收缓冲区和发送缓冲区)
数据报服务:数据段发送的次数和接收的次数相等,若果接收端一次未将一段数据报读取完,则UDP报文段中的数据丢失
![](https://i-blog.csdnimg.cn/blog_migrate/651247360af40d3310f1f4639107b72e.png)
如图可以看出,使用TCP协议通信时,当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的关系。
当接收端收到一个或多个TCP报文段后,TCP模块将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中(验证了TCP通信可靠性服务中的数据不乱序),并通知应用程序读取数据。接收端应用程序可以一次性将TCP接收缓冲区中的数据全部读出,也可以分多次读取。因此,应用程序执行的读操作和TCP模块接收到的TCP报文段的个数之间也没有固定的数量关系。
综上所述,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何的数量关系,这就是字节流服务的概念。
![](https://i-blog.csdnimg.cn/blog_migrate/57c23890391010119aaa58ebfd545b14.png)
在UDP的数据报服务中,发送端应用程序没执行一次写操作,UDP模块就将其封装成一个UDP数据报并发送之。接收端必须及时针对每一个UDP数据报进行读操作(recvfrom系统调用),否则就会丢包。并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断。
- 数据的可靠性服务
- 所有的数据都能到达对端:确认机制&超时重传机制
- 数据不乱序:由TCP报头中的序号处理所有报文段的顺序和重复问题
- 数据不出错:16位的校验和不仅校验TCP头部,而且校验数据部分(CRC算法)
![](https://i-blog.csdnimg.cn/blog_migrate/8316c20e64049297888bc97de42edbd4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/424ece7e6f70c5409eb9c4b500d3b3a8.png)
可见UDP数据报相对于TCP报文段要简单不止十倍!