TCP和UDP的区别

mac2026-08-12  5

TCP与UDP区别: TCP        面向连接的     可靠的     字节流服务     TCP服务器必须给每个连接分配资源 UDP        无连接     不可靠的     数据报服务     UDP服务器不需要给每个连接分配资源

TCP:       ①字节流服务(数据收发的一种方式):      如图:                发送端:                               发送了三个数据,send了三次。(应用层)                               将三个数据放入发送缓冲区中。(内核中)                               底层有可能将这三个数据拆分成两个数据段发送到接收端,具体怎么发我们无法控制,后面有                               流量控制方法控制它怎么发送(网络中)

               接收端:                               最上面为应用层进行recv。(recv若较大可一次接收,若不够大也可多次接收)                               接收端接收数据时会有一个接收缓冲区存在,底层接收到这个数据会将TCP报文段放入接收缓                               冲区中,接收端接收数据时会从接收缓冲区中获取数据。(数据不会丢失)      字节流服务的特点:           1.发送端send的次数与接收端recv的次数不相等           2.发送端send的次数与网络层封装的TCP报文段的个数不相等           3.接收端recv一次如果没有将数据读取完成,则下次recv会继续读取后续数据(因为有接受有缓冲区)

      ②可靠的:TCP可以保证数据安全地到达对端           数据的可靠性传输定义:                1.所有的数据都能到达对端(确认机制和超时重传保证)                2.数据不乱序(TCP报头中的序号来保证,序号还能处理重复的报文段)                3.数据不出错(16位校验和,不仅校验头部而且还校验数据部分)                4.拥塞控制&滑动窗口(保证数据传输中最小的丢包率)           TCP为什么可以安全地保证数据到达对端?                与TCP的协议有关,协议最重要的是它怎么对传输的流程进行控制。数据在发送时,只要到达传输层,                若选TCP则包含TCP报头,报头信息则是做发送控制的,多加了一些数据保证安全。 详情请点击:TCP首部及TCP首部各个字段

UDP:      ①数据报服务(数据收发的一种方式):      如图:                发送端:                               发送了三次数据,sendto了三次(应用层)                               sendto一次直接将数据发给传输层变成UDP报文段(sendto几次就会有几个UDP报文段)                               通过底层传输数据被传送到接收端。

               接收端:                               通过底层对应接收到了三个UDP报文段。                               三个UDP报文段在应用层读取时候对应三个recvfrom。即发送几次收几次

     数据报服务的特点(相比于字节流服务稍微快一点):           1.发送方sendto的次数和接收方recvfrom的次数相等           2.发送方sendto的次数与网络底层封装的UDP报文段的个数相等           3.如果接收方一次recvfrom没有将一个UDP报文段的数据接收完,则此报文段中剩余的数据会被丢弃

Linux下UDP字节流服务的测试: 1.若将接收的大小改为5个字节大小,发送hello world与this is linux情况(recv发生阻塞,只接收5个字符,后面数据丢失) 2.服务器先睡眠20s,客户端发送数据,先启客户端再启动服务器(每隔20s接收到一个数据,全部接收到了且发送次数与接收次数相等)       ②不可靠的:UDP校验和只负责校验此数据是否有错,并不纠错,如果错了,就丢失,因此不可靠。

小问题思考:UDP本身是不可靠的,如果非要使用UDP来实现数据的可靠传输该怎么做?      一些小思路(不一定正确):      UDP本身报头8个字节是固定的,无法更改,所以我们只能在应用层进行控制。      应用层:自己写的协议得包含相应的控制信息,接收端接收到数据时候要根据应用层这些协议做相应处理,例如:排序、丢掉重复报文、进行相应冗余检验。      应用层实现存在弊端:是发送数据还是做控制。得启动两个进程,一个进行发送数据,另外一个检测数据,再发送回来(进程间通讯)。      应用层还要实现缓存机制。

最新回复(0)