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个字节是固定的,无法更改,所以我们只能在应用层进行控制。
应用层:自己写的协议得包含相应的控制信息,接收端接收到数据时候要根据应用层这些协议做相应处理,例如:排序、丢掉重复报文、进行相应冗余检验。
应用层实现存在弊端:是发送数据还是做控制。得启动两个进程,一个进行发送数据,另外一个检测数据,再发送回来(进程间通讯)。
应用层还要实现缓存机制。