景区类网站,河北建设银行石家庄分行招聘网站,怎么注册网站免费的,烟台网站建设力推企汇互联见效付款用UDP一定比用TCP快吗#xff1f; 假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。
对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到#xff0c;就像打电话一样#xff0c;只要“喂喂两下对方就能回你个…用UDP一定比用TCP快吗 假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。
对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到就像打电话一样只要“喂喂两下对方就能回你个hi hi你就知道对方有没有在听
UDP就像是给邮政的信箱寄信一样你寄出去的信根本就不知道对方有没有正常收到丢了也是有可能的 可以通过创建socket的方式来选择使用TCP还是UDP
fd socket(AF_INET,SOCK_STREAM,0)是指使用字节流传输数据就是TCP协议
fd socket(AF_INET,SOCK_DGRAM ,0)是指使用数据报传输数据就是UDP协议
返回的FD是指socket句柄可以理解为socket的身份证号这时候根据协议的不同还要执行一些操作如果一切顺利就可以开始传输消息如果不顺利比如消息发到一半丢包了那UDP和TCP的态度就不太一样了。
UDP管我什么事TCP可靠性是不是发的太快了是不是链路太堵了不过放心会重发的。
TCP为了保证可靠性
重传机制TCP会给发出的消息打上一个编号也就是sequence接收方收到后回一个确认ack包发送方可以通过ack的数值知道接收方收到了哪些sequence的包如果长时间等不到对方的确认TCP就会重新发送消息这就是所谓的重传机制重传对性能影响比较严重是下下策。 TCP就需要思考怎么尽量避免重传因为数据发送方和接收方处理数据能力可能不同以此可以根据双方的能力去调整发送的数据量就好了就有了发送和接收窗口
接收方当前能接收的数据量大小TCP根据窗口的大小去控制自己发送的数据量这样就能大大减少丢包的概率比如一开始窗口大小为2。 收到一个数据包之后窗口就变成了1此刻只能再收一个数据包。 当接收窗口变为0时也就是所谓的0窗口此时发送端停止发送数据接收方接收到数据之后会不断处理处理能力也不是一成不变的有时候处理的快一些就可以多收点数据处理的慢点就希望对方能少发点数据像这种根据自身能力不断调整窗口的机制就是所谓的滑动窗口机制 通过滑动窗口机制TCP实现了流量控制但这还不够有时候发生丢包并不是因为发送方和接收方的处理能力问题导致的而是跟网络环境有关将网络想象为一条公路马路上可能堵满了别人家的车只留下三辆车的空间你也没办法同时上路
TCP希望能感知到外部网络环境根据网络环境及时调整自己的发包数量但外部环境这么复杂TCP是怎么感知到的呢
TCP会先慢慢试探的发数据不断加码数据量越发越多先发一个再发两个再发四个直到出现丢包这样TCP就知道当前网络大概吃得消几个包了这就是所谓的拥塞控制机制 流量控制和拥塞控制的关系
流量控制针对的是单个连接数据处理能力的控制拥塞控制针对的是整个网络环境数据处理能力的控制
都是怎么降低重传的概率降低带来的影响
当我们需要发送一个超大的数据包时如果数据包丢了就得重传同样大的数据包 但如果将其分成一小段一小段就算丢了也就只需要传那一小段就好了大大减少了重传的压力
这就是TCP的分段机制 所谓一小段的机制在传输层叫MSSmaximum segment size数据包长度大于MSS则会分成n个小于等于MSS的包 如果数据包还大于MTUmaximum transmit unit还会继续分包 一般情况下MSS等于MTU减去40 byte 所以TCP分段后到了IP层大概率就不会再分片了既然数据包会被分段链路又这么复杂还会丢包那么数据包乱序也就显得不奇怪了。
乱序的问题TCP也考虑到了依靠数据包的sequence接收方就能知道数据包的先后顺序后发的数据包先到就先放到专门的乱序队列中等数据都到齐后 重新整理好数据包顺序后再给到用户这就是乱序重排机制
网络环境列路很长还复杂数据丢包是很常见的平常用TCP做各种数据传输完全对这些事情无感知
TCP三大特性 UDP没有这么多复杂的特性所以很快
这就是大部分人认为UDP比TCP快的原因实际大部分情况下确实是这样
有没有用了UDP但却比TCP慢的情况
UDP的用途大部分人不会尝试直接拿裸UDP放到生产环境中去做项目
UDP的价值本质是内核提供的一个最小网络传输功能很多时候都号称自己用了UDP但实际上都很忌惮他的丢包问题所以大部分情况下都会在UDP的基础上做各种不同程度的应用层可靠性保证某些游戏为了追求低延迟不同程度使用了UDP比如王者农药KCP
适合用于音视频传输因为这些场景允许丢包
虽然选择了使用UDP但是还是会在这一基础上做一些重传机制
如果现在需要传一个特别大的数据包在TCP内部会根据MSS的大小分段这时候进入到IP层之后每个包大小都不会超过MTU因此IP层一般不会再进行分片这时候发生丢包只需要重传每个MSS分段就够了。
但对于UDP本身并不会分段如果数据过大到了IP层就会进行分片此时发生丢包再次重传就会重传一整个大数据包对于上面这种情况使用UDP就比TCP慢
解决起来也不复杂如果使用UDP的应用层也实现了分段机制就不会出现上述的问题。