tcp和udp区别

tcp是面向连接的,可靠的,流式数据。面向连接是tcp在传输数据之前要通过三次握手建立连接,结束后要四次挥手断开连接,可靠体现在数据传输时,

1:确认机制,每个tcp报文段发送之后都必须得到接收方的应答,才能认为这个报文段传输成功。

2.超时重传机制:发出一个tcp报文段后启动定时器,如果在定时时间内未收到应答,则重发。

3.校验和:TCP将始终保持首部和数据的校验和,如果收到的报文段的检验和有差错,便将其丢弃,希望发送端超时重传。

4..重新排序:由于IP数据报的达到可能失序,因此TCP将会数据进行重新排序,以正确的顺序交给应用层。

5.丢弃重复:由于IP数据报有可能重复,因此TCP将会丢弃重复的数据。

6.流量控制:TCP连接的两端都有固定大小的缓冲区空间,TCP接受端只允许对端发送本端缓冲区能容纳的数据。

7.拥塞控制:慢启动,拥塞避免,快速重传,快速恢复

 

怎样理解流式呢,就是通过tcp发送数据,比如发送方一次发送100字节,接收方可以一次接受100字节,也可以分10次接受,每次接受10字节,也可以分100次,每次接受1字节,也就是说发送数据和接收数据次数没有关系。说到发送数据,send函数仅仅是将数据拷贝到tcp发送缓冲区中,而真正发送数据的是协议,比较发送数据和缓冲区的大小,如果大于,返回错误,小于,看协议是否在发送数据,在发就等待,没发就比较缓冲区剩余字节数和发送数据的大小,大于,等数据发完再拷贝进去,小于,直接拷贝进去。拷贝完send就返回了。如果拷贝出错,返回socket_error,网络出错,返回0。

recv接受的话先看协议是否在接收数据,在接收则等待,否则将接受缓冲区中的数据拷贝到Buf中。可能数据大于buf,就要分多次拷贝。recv返回实际拷贝字节数,拷贝出错返回socket_error,断网返回0

数据报式,就是发送方每执行一次写操作,就将数据封装成一个udp数据报,接收方必须针对每个数据报执行读操作,否则会丢包。

所以它的缺点是速度慢,效率低,因为建立连接,确认、重传,拥塞控制都要花时间,占用资源高,因为每个连接都会占用系统的CPU,内存等资源,并且因为有确认,三次握手这些过程,容易导致tcp被人利用,实现DOS,DDOS等攻击。

tcp只支持一对一的连接,而udp支持一对一,一对多,多对一,多对多的通信

tcp首部占20字节,而udp占8字节

 

udp是无连接,不可靠,数据报式。他没tcp三次握手,确认、重传、拥塞控制等机制,所以它的传输速度快,占用资源较少,尽可能大的交付数据,不保证可靠交付。应用层自己实现数据确认,超时重传等逻辑。

因为没有这些机制,所以在数据传递时,网络不好的话,可能会出现丢包现象。

 

所以当对网络通信质量有要求的时候,比如数据要准确无误的传给对方,比如http,https,ftp等传输文件的协议,或者POP,SMTP等邮件传输协议式,选择tcp。

当对网络通讯质量要求不高时,并且通讯速度能尽量的快,就选择udp,比如日常中的QQ语音,视频,TFTP简单文件传输

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值