TCP和UDP的区别

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值