网络协议那些事2 --- 像极了爱情的网络协议

2020-01-13

像极了渣男爱情的网络协议

人们都说TCP是面向连接的,UDP是面向无连接的。那么问题来了什么是连接?

UDP & TCP的区别

建立连接

  • 建立连接

一种网络协议,依赖发送方和接收器之间的显示通信和阻塞以管理双方的数据传输.网络系统需要在两台计算机之间发送数据之前先建立连接的一种特性。面向连接网络类似于电话系统,在开始通信前必须先进行一次呼叫和应答。

  • 普通话版本

可以把客户端和服务端想成锡纸烫和大波浪,这两个人如果想合法的嘿嘿嘿,首先要互相确认关系,然后步入婚姻的殿堂,然后才能嘿嘿嘿。所以建立连接就是 为了维护双方交互的状态,需要一定的数据结构来保证这个特性,这个特性就是面向连接的特性。

可以认为TCP是靠谱的高端婚介会所,提供可靠交付,保证大波浪和锡纸烫之间爱情小火花无差错,不丢失,不重复,按顺序到达。而UDP就是混乱的night club 男男女女之间的嘿嘿嘿和小火花是不稳定的,不保证按顺序到达,不保证不丢失

面向字节流

发送的时候发的是流,ip包是一个个的包,tcp通过自己的结构维护成了流。 UDP则继承了ip的特性,基于数据报,一个一个的发,一个个的收

拥塞控制

TCP就像有场控的婚介,可以控制发送的行为,当包丢了,或者网络环境不好了,tcp则会调整自己的行为。而UDP就不会,露天club,多多益善,发使劲发,都给老子发出去。

有状态的服务

TCP明确的记录了发送状态,接受状态。而UDP则是没有状态,发出去就发出去了,后面的,对不起和我UDP 没有关系。

UDP

包头

UDP 的包头有: 源端口号,目标端口号,udp长度,校验和,数据。

可以看出这个结构简直简单的很,所以沟通简单。而且谁都可以发谁都可以收,没有拥塞等字段来控制。

使用场景

  1. 内网
  2. 组播多播的需要的时候 DHCP,VXLAN
  3. http 3 的 QUIC
  4. 流媒体: 视频直播
  5. 实时对战游戏
  6. 移动通信。

TCP

包头

TCP的包头由下面的几个部分组成: 源端口号,目标端口号,序号,确认序号,首部长度,状态位:syn/ack/fin/rst/psh/urg等,窗口大小, 校验和,紧急指针,数据组成

可以看到包头要比udp复杂的多。那么这些部分有什么用?

  1. 顺序问题,序号确定发出顺序,确认序号确定接受顺序
  2. 丢包重传,根据确认序号确定重传的问题。
  3. 链接维护,状态位用来维护链接。
  4. 拥塞控制: 根据窗口大小调整接受能力
  5. 流量控制:根据窗口大小,调整发送能力

如果把tcp比喻成锡纸烫的话,就是他会把自己勾搭的那些妹子拍个序,万一要是不能雨露均沾 自己被拉黑了就不能成为一个合格的渣男了。所以他把那些妹子编了号(序号),并且保证万一哪个妹子最近没联系他,他就要主动出击去撩妹。

锡纸烫作为渣男中的战斗机,自然也不会因为回复4分颜值的妹子而错过了8分妹子的消息(保证顺序)。

他怎么知道自己有没有被拉黑呢,就是通过确认序号,假设他发了美女在吗,结果收到了红色叹号:对方不是您的好友,就证明丢包了,要重新的发送加好友请求。(这么说还是个伪舔狗?)锡纸烫还会把自己撩妹子的进度标出来:SYN 就是您好美女(发起一个连接),ACK 是美女回复的hi(回复),RST 是被拉黑之后重新打招呼,FIN 可能就是同事组吧,绝对不私聊。

tcp还会规定一段时间内撩妹子的个数(流量控制),这样能保证自己不会错过每个妹子的消息,也不会让自己无妹可聊。

总的来说,tcp就是一个有规划有原则的锡纸烫,渣男中的战斗机。

渣男的困惑---如何正确的维护自己和备胎之间的聊天

假设锡纸烫最近撩到一个7分妹子,锡纸烫非常想和她聊天,所以在他发了hello,美女之后,假设在一定时间内,他没收到回复,作为一个情场高手,肯定不会一直等啊等。短时间没收到回复,他就会再发消息 美女我觉得你笑起来很像某个明星。这样也许就能收到了回复了。

假设今天锡纸烫巨巨巨忙,可能中午才回复早上大波浪们发的消息,那他机智的使用群发功能,进行累计确认,这样就很省事了。当然不是每种消息都能这么回,他还要把波浪们的消息进行分类

level1:我发了消息,并对方回复了的;

level2:我发了消息,对方没回复的;

level3: 我还没回复的但这次准备发消息的;

level4: 我还没回复,但这次也不准备发消息的。

锡纸烫规定了一个拥塞窗口,通过控制回复的数量,准确的回复到每个备胎。这个窗口大小等于level 2 + level 3 的妹子总数。超过数目,锡纸烫怕翻车,少于这个数目,锡纸烫嫌麻烦。

天真的锡纸烫以为只有自己蹲草丛不沾叶,万万没想到,大波浪也不是个纯情的人,他也有一个记录:记录哪些备胎给自己发消息并且自己回复了的,哪些还没回复,对于同事分组也许就不回复了。

那么问题来了,锡纸烫怎么确定回复的数量呢?

流量控制

正常情况下 他发送了一个聊天之后结束了,就会移动发下一个新的妹子,聊天妹子的总数是保持不变的。

但有一天 , 锡纸烫喝大了,飘了,同时给12个妹子都发了消息,但对面都没有回复,可是他此时没办法再撩别的妹了,因为如果12个妹子同时回复,他肯定会翻车,所以他就只能减少同时聊天的个数,缩减窗口大小, 不再找新的妹子。

拥塞控制

如果说流量控制是锡纸烫自己控制自己发送的个数,那拥塞控制,就是控制他收到的妹子尬聊的个数。

假设今天锡纸烫魅力爆棚,20个妹子同时找他聊,他本来能维持5个妹子的聊天不聊串,现在20个来找他,他怎么办,不重要的就标记为未读,这种方式相当于加了一个缓存,等我结束了和女神对话的聊天再来缓存找你们, 但这样有个问题就是时间延长了,脾气火爆的妹子一看你半天不回,拉黑,什么玩意。等锡纸烫点开发现这是个8分妹子 悔不当初,只能超时重传重加好友。 所以为了防止这样的事情发生,锡纸烫发现可以通过慢启动的方式保证自己不回被拉黑。 自己慢慢的增加撩妹的个数,一开始是一个,cwnd设置为一,当结束了这个妹子的对话的时候,发现可以撩两个,cwnd为2,两个结束的时候,他觉得自己能再翻个倍,cwnd为4.。 那什么时候是个头?ssthresh来控制,65535为上线,超过这个值的时候,锡纸烫不能再增加了,知道自己改慢慢来,直到出现了回复不过来了,妹子减为一半。 这个锐减 可以说是十分不聪明的,大波浪觉得你凭啥平时2分钟回复,现在十分钟回复?拉黑、

机智的锡纸烫意识到了这点,发明了bbr拥塞算法,通过找到一个平衡点,让聊天的妹子达到峰值,但标记未读的不是最大值,这样自己就不会轻易被拉黑了。

总结

tcp和udp都算是渣男,对比udp广撒网的行为,tcp更像一个衣冠禽兽,有组织有预谋的维护这自己的备胎网。

原文链接:juejin.im

上一篇:基于 HTML5 + WebGL 的 3D 风力发电场
下一篇:手写一套完整的基于Vue的MVVM原理
相关教程
关注微信

扫码加入 JavaScript 社区

相关文章

首次访问,需要验证
微信扫码,关注即可
(仅需验证一次)

欢迎加入 JavaScript 社区

号内回复关键字:

回到顶部