吉法师的博客

不知道能否追到喜欢的人呀,今年努力下吧~ 2022.1.4

趣谈网络协议学习笔记

一、通讯协议综述

1.有了IP地址为什么还需要Mac地址?

IP地址相当于是传送数据到某个位置,但不知道具体给哪台计算机,MAC地址就是为了解决这个问题。

至于修改MAC地址,实际上是修改了系统读取出来的这个MAC地址。也曾出现过两块劣质的网卡都是同一个MAC地址的情况,这样甚至会导致网络的堵塞。

mac是身份证,ip是地址。

用总经理和员工来比喻网络协议

不准确,因为开会的时候员工未必会给会议提出建议,而一次tcp的三次握手,每次握手ip和mac层都加入了自己的包头。

2.学习的方法

理解网络协议的工作模式,有两个小窍门:始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

3.网段

网段图

私有IP地址是可以重复的,共有的则必须唯一。网段的划分是为了弥补刚开始对于计算机数量估计严重不足的问题。

lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。

也就是说本机通信是不会走到网卡的,socket对于本机通信的处理速度也会非常快。

4.动态主机配置协议(DHCP)

一个新机器加入一个网络的时候,会用IP地址0.0.0.0发送广播包,目标为255.255.255.255,封装了BOOTP协议。

内容大概如下:

DNCP

DHCP会给新人分配IP地址,若新机器收到了多个DHCP服务分配的ip地址,一般会使用第一个,然后告诉其他的DHCP server,它们分配的IP地址没有被使用。

IP 地址的收回和续租

大概在租期过去50%的时候,机器会给DHCP服务发送报文,更新自己的ip地址信息。

5.MAC层、ARP和交换机

  • 交换机的学习能力:交换机一开始会广播数据,后面知道目标的MAC地址之后,就会固定往这个端口发送数据了。

  • MAC层用来解决多路访问的堵车问题:

  • 将一根网线在交换机上短接,交换机会发现自己无法发送数据,一直在向外广播,就会形成广播风暴。

  • ARP靠询问广播的方式寻找目标的MAC地址,之后会记入缓存。

6.STP协议

简单来说就是生成一个树,统一管理下面的节点,防止广播风暴问题。

STP

7.UDP协议的运用

游戏有一个特点,就是实时性比较高。快一秒你干掉别人,慢一秒你被别人爆头,所以很多职业玩家会买非常专业的鼠标和键盘,争分夺秒。因而,实时游戏中客户端和服务端要建立长连接,来保证实时传输。

但是游戏玩家很多,服务器却不多。由于维护 TCP 连接需要在内核维护一些数据结构,因而一台机器能够支撑的 TCP 连接数目是有限的,然后 UDP 由于是没有连接的,在异步 IO 机制引入之前,常常是应对海量客户端连接的策略。

游戏对实时要求较为严格的情况下,采用自定义的可靠 UDP 协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。

流媒体播放往往也是采用udp协议,就是因为担心tcp协议因为网络传输不畅,自行降低传输速率的行为,导致视频播放出现卡顿。

8.TCP包头格式

TCP包头

TCP包的编号,就是为了告诉双方数据包的先后顺序。

三次握手

三次握手主要是需要第三次确认服务端自己的发送能力,客户端的接收能力。

四次挥手

四次挥手是由于tcp的半连接状态,没有四次挥手会出现一边只能发送,一边只能接收等情况。

二、应用层

1.Http协议报文格式

请求:

Http协议请求报文

其中sp是空格,CR、LF代表回车换行。

应答:

Http协议应答报文

2.高并发下的业务架构

通过中间层来挡住对大容量数据的请求,而通过缓存来进行处理

高并发

3.CA证书

证书内包含公钥,所有者,有效期,用来解决双方进行非对称加密的时候防止中间人攻击的问题。

因为客户端和服务端都需要用对方的公钥来进行加密,用自己的私钥进行解密。而传输的过程必须进行CA认证。

CA机构也有上级,称为ROOT CA

三、数据中心

1.DNS

DNS协议负责告诉用户要访问的域名对应的IP地址。DNS服务器会缓存接触过的计算机IP地址,但当ip地址不在缓存列表中的时候,就会逐一询问。

dns

2.传统DNS面临的问题

  • 域名服务器本地会储存访问过的IP地址,之后访问的时候如果读取了缓存,很可能IP地址都过期了。用户访问了那个IP地址,却会发现并不是自己的目标地点。

  • 域名转发,可能会出现明明是自己管理的IP地址,却让其他运营商来负责转发了。

  • 域名更新缓慢,全网更新效率很低。

  • 解析延迟,DNS 的查询过程需要递归遍历多个 DNS 服务器,才能获得最终的解析结果,这会带来一定的时延,甚至会解析超时。

3.HttpDNS技术

HttpDNS 其实就是不走传统的 DNS 解析,而是自己搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析的时候,直接通过 HTTP 协议进行请求这个服务器集群,得到就近的地址。

HttpDNS 的工作模式:

在客户端的 SDK 里动态请求服务端,获取 HttpDNS 服务器的 IP 列表,缓存到本地。随着不断地解析域名,SDK 也会在本地缓存 DNS 域名解析的结果。当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。

这个缓存和本地 DNS 的缓存不一样的是,这个是手机应用自己做的,而非整个运营商统一做的。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情。

如果本地没有,就需要请求 HttpDNS 的服务器,在本地 HttpDNS 服务器的 IP 列表中,选择一个发出 HTTP 的请求,会返回一个要访问的网站的 IP 列表。

4.CDN分发技术

CDN实现了在数据中心里部署几台机器,形成一个缓存的集群来缓存部分数据,那么用户访问数据的时候,就可以就近访问了。

这些分布在各个地方的各个数据中心的节点,就称为边缘节点。由于边缘节点数目比较多,但是每个集群规模比较小,不可能缓存下来所有东西,因而可能无法命中,这样就会在边缘节点之上。

有区域节点,规模就要更大,缓存的数据会更多,命中的概率也就更大。在区域节点之上是中心节点,规模更大,缓存数据更多。如果还不命中,就只好回源网站访问了。

CDN

四、补充

1.什么是RPC

RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。

调用过程

  1. 首先客户端需要告诉服务器,需要调用的函数,这里函数和进程ID存在一个映射,客户端远程调用时,需要查一下函数,找到对应的ID,然后执行函数的代码。

  2. 客户端需要把本地参数传给远程函数,本地调用的过程中,直接压栈即可,但是在远程调用过程中不再同一个内存里,无法直接传递函数的参数,因此需要客户端把参数转换成字节流,传给服务端,然后服务端将字节流转换成自身能读取的格式,是一个序列化和反序列化的过程。

  3. 数据准备好了之后,如何进行传输?网络传输层需要把调用的ID和序列化后的参数传给服务端,然后把计算好的结果序列化传给客户端,因此TCP层即可完成上述过程,gRPC中采用的是HTTP2协议。

2.http数据体

POST /purchaseOrder HTTP/1.1---- 这一行 请求行
Host: www.geektime.com
Content-Type: application/json; charset=utf-8
Content-Length: nnn,从这一行往上是请求头,
                                    这里必须是一行空行,这也是http请求的结构的一个必须存在的
{
 "order": {
  "date": "2018-07-01",
  "className": " 趣谈网络协议 ",
  "Author": " 刘超 ",
  "price": "68"
 }
}
请求体

Share