questions
体系结构
MAC头部:6
IP头部:20
TCP头部:20到60字节
UDP头部:8
TCP最大长度 65535 - 头部
UDP最大长度 65535 - 头部
RPC和HTTP(RESTFul)的区别
- 支持的协议:RPC支持多种协议,包括上层实现,比如grpc基于http2.0实现的,HTTP底层是TCP
- 消息的序列化:RPC,支持多种消息,protobuf/json等,HTTP底层是用json,xml封装的request的文本协议,进行序列化反序列化的
- http的请求头部很长,rpc的话一般可以压缩一些
为什么微服务用grpc而不是http
grpc 基于HTTP/2 提供了诸如多路复用、头部压缩等特性,可以显著提升通信效率get post put delete的区别【幂等性:操作多次,导致服务器到达的结果是想等的】
- get,一个具有幂等性的请求,参数在url后作为参数,只有get的请求数据会被缓存
- post,不具有幂等性,参数封装在请求体中,数据不会被缓存
- put一般放文件,delete用来删除文件,也都是幂等的
三次握手变成两次会发生什么
https://zhuanlan.zhihu.com/p/347519096
https://blog.csdn.net/lengxiao1993/article/details/82771768
- 第三次握手报文没有的话,二次握手维护的序列号没有第三次的确认号确认,服务端就无法确认客户端准备ok,触发超时重传,就无法协商它们的滑动窗口和拥塞窗口了
四次握手第四次没确认的话会发生什么
四次没确认就是四次握手最后一次time-wait状态为什么要等待两个MSL
两个最大生存时间 - 为了保证A对第三次FIN挥手的确认报文到达B,如果没收到第四次的握手确认,B重传第三次挥手信号
为什么不是一个MSL
如果检测丢包所用的时间用了一个MSL,就根本没有接收到三次握手重传报文的机会了TCP的字节序是大端还是小端【大端】为什么?
小端字节序是将最低有效字节存储在内存的最低地址处,而大端字节序则是将最高有效字节存储在最低地址处。 - 网络字节序是大端,arm64和x86主机采用主机字节序,是小端
- 如果两台主机的CPU架构或者字节序不同(比如一台是小端序,另一台是大端序),TCP协议会在传输过程中自动进行字节序的转换,以保证接收方能够正确地解析数据。
- 头部维护的校验和字段(CRC)
- 三次握手和四次挥手
- 超时重传(TTS字段)
- 流量控制(滑动窗口)
- 拥塞控制(拥塞窗口 + 慢启动)
TCP半连接队列和全连接队列
在TCP连接的建立过程中,会涉及到半连接队列(SYN队列)和全连接队列(ESTABLISHED队列)。
- 半连接队列中存放的是三次握手中的第一步(即SYN)发送的连接请求,还没有得到完全建立连接的确认
- 当TCP连接成功建立后,会被移动到全连接队列
粘包和拆包
由于网络传输中的数据分片、路由器缓冲区大小限制、接收端缓冲区大小设置等因素造成的 - 粘包:多个数据包被合并成一个大的数据块
- 拆包:只收到了一个大包,被拆成了多个小块
- TCP选项字段可以设置MTU,指网络通信中能够通过的最大数据包的大小。通过设置MTU,可以控制单个数据包的大小,但并不能解决粘包和拆包的问题。
- 粘包和拆包问题主要是因为TCP协议是流协议,它并没有记录消息的边界信息。因此,在数据传输过程中,可能会出现多个消息被合并成一个包(粘包)或一个消息被拆分成多个包(拆包)的情况。
TCP为什么要等待2MSL【为了保证最后一次握手成功】
因为服务端发送FIN以后,客户端发送第四次的挥手确认后,服务端可能接收不到,触发了重传,一个四次挥手的ACK和重传的FIN各占一个MSL
TCP最大长度为2的32次方-头部字段
解决办法【固定长度,消息边界,定时器,缓冲区】
- 头部字段,固定消息长度
- 帧数据字段加入边界信息,比如某个特定字符
- 使用定时器来等待足够长的时间以接收完整的消息,
- 可以通过合理设置缓冲区大小来保证完整接收消息
TCP的TIMEWAIT状态过多会发生什么
TCP的TIME_WAIT状态发生在第四次挥手,是为了确保在网络中所有的数据包都被正确地接收和处理,以避免出现数据包混淆或丢失的情况 - 内存资源、端口资源大量被占用,新连接无法建立,被网络攻击,导致程序崩溃等情况
- 拒绝服务(DOS)攻击,端口扫描攻击
【如何解决】
- 在程序里设置一个等待参数,超时退出
- 使用连接池复用连接
传输内容
应用层 报文
传输层 报文段
网络层 数据包
链路层 数据帧
物理层 比特流网络层实现转发
路由表是使用什么数据结构查找的?路由表中没有要查找的IP怎么办?
路由表通常使用前缀树(Trie)存储路由表项,存的是一个IP地址与下一跳路由器,即路由器的IP地址,的映射
没有要查找的IP,则跳到默认的下一跳,如果一直转发默认下一跳,则丢弃或者不可达信号
简述TCP的拥塞控制
首先,通过慢启动机制,当建立新的TCP连接时,发送方会谨慎地开始发送数据,逐步增大发送量以避免过快发送引起网络拥塞,每次x2。其次,一旦拥塞窗口达到设定阈值,TCP进入拥塞避免状态,发送方将以线性方式增大拥塞窗口,以保持合理的数据传输速率。
- 发现数据丢失时,用快速重传和快速恢复机制:1.计时器检测没有确认,超时重传发生,TCP会将拥塞窗口减半,再线性增加。
简述TCP的流量控制【确保接收方能以自己的接收速度来处理】
通过接收方维护接收的窗口实现的。
发送方1. 应用层
HTTP的无状态、明文传输特性
- 无状态:在处理每个请求时都不会记住之前的请求,每个请求都是独立的,不依赖于之前的请求
- 状态码:状态码用来指示服务器对请求的处理状态
HTTP缓存
- 强制缓存:浏览器判断缓存没有过期,则直接使用浏览器的本地缓存
- 协商缓存:通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存,响应状态码为304。
- 【TIP】只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。
HTTP 和HTTPs 的区别
- HTTP是明文传输,HTTPS使用了SSL证书来建立加密传输过程,HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
- HTTP是直接运行在TCP协议基础上的,HTTPS是运行在SSL协议上,其中SSL协议建立在TCP之上,使用加密和身份验证保证安全性
- HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- CA证书放在服务器上,证书内容包含服务器的公钥、持有者信息、颁发者信息、有效期等等
- CA证书验证:服务器向客户端发送证书时,客户端会使用相应的CA的公钥来验证证书的合法性。包括检查证书的数字签名是否正确、证书是否在有效期内等。
- CA信任链验证:如果客户端信任该CA(通常是因为CA的根证书预装在操作系统或浏览器中),那么客户端将信任由该CA签发的证书。
cookie和session,token的区别
https://zhuanlan.zhihu.com/p/625995458
https://zhuanlan.zhihu.com/p/164696755
1.区别
- cookie存在本地,session存在服务器上,cookie不安全,用户本地向服务器请求的申请,session用于会话控制,在服务端记录用户状态
- cookie存的字段都是字符串,session的话,跟随服务端数据类型
- cookie存的数据较少,最多4kb;session可以存的多,生命周期比短
- cookie主要字段如下:name expires domain path
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20session存的具体字段取决于你在应用程序中选择存储的信息。这些字段可以是任何你认为在会话期间需要跟踪和使用的数据。以下是一些可能存储在Session中的字段的例子:
用户ID:用于标识当前会话所属的用户。
示例:user_id: 12345
用户名:用于显示在界面上或者用于显示欢迎消息等。
示例:username: johndoe
角色或权限信息:用于确定用户具有的权限级别或角色。
示例:role: admin
购物车内容:存储用户在购物网站中选择的商品信息。
示例:cart: [item1, item2, item3]
用户首选语言:用于提供多语言支持。
示例:preferred_language: en
上次访问时间:用于跟踪用户的活动情况。
示例:last_visit: 2023-11-05 10:30:00
登录状态:用于标识用户是否已登录。
示例:logged_in: true
安全令牌:用于防止CSRF等安全攻击。
示例:csrf_token: abcdef123456
用户设置:例如主题偏好、通知偏好等。
示例:theme: dark
2.作用机制
cookie存了一个session ID,用户发请求时,cookie随请求body一起提交,然后session根据ID解析用户名密码,如果没找到,说明用户没登录或者失效
3. token是什么
token的生命周期: token的验证:再次请求时,携带此token,则服务端再次根据用户标识,生成token,根据两个token是否一致且未过期来判定用户是否已授权。
1 | 1. 客户端使用用户名跟密码请求登录 |
- 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
- 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
- token 完全由应用管理,所以它可以避开同源策略
- token由服务器生成并返回给客户端,是一种no-session的方式(当然也不需要cookie)。在Web应用程序中,Token通常是包含用户身份信息的加密字符串,JWT的工具类
4. token和session-cookie
- token使每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。
- Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌,访问资源接口(API)时所需要的资源凭证。
- Token 使服务端无状态化,不会存储会话信息。
- jwt是时间换空间,大量并发请求会导致压力比session方式压力大,然后在服务端生成jwt,每次请求都有新的jwt,如果用https请求发送,安全性也高一些
- jwt一旦创建就得等待过期,session适合用于大型项目
6. 分布式session
- 共享session
首先保证一个可用的redis集群,可以加redis服务器水平扩展,服务器重启session不会丢失 - session复制,在各服务器里复制,会造成网络负荷压力
- 粘性session,将请求重定向到某个有session的服务器上,负载均衡去转发,缺乏容错措施
权限认证
https://juejin.cn/post/7121237647829237768
https://juejin.cn/post/7288961029936578560
- JWY包括头部(Header)载荷(Payload)签名(Signature)三个部分
rpc完整的调用过程
- 调用方持续把请求参数对象序列化成二进制数据,经过 TCP 传输到服务提供方;
- 服务提供方从 TCP 通道里面接收到二进制数据;
- 根据 RPC 协议,服务提供方将二进制数据分割出不同的请求数据,经过反序列化将二进制数据逆向
- 还原出请求对象,找到对应的实现类,完成真正的方法调用;
- 然后服务提供方再把执行结果序列化后,回写到对应的 TCP 通道里面;
- 调用方获取到应答的数据包后,再反序列化成应答对象。
RPC的关键技术
HTTP状态码目录
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
- 200:成功返回响应
- 301:永久重定向,客户端第一次访问此 url 时,告知客户端以后直接访问新的 url,该状态保存在浏览器缓存中。
- 302;临时重定向,客户端每次访问此 url 时,告知客户端重定向到新的 url ,后续访问依然访问当前的 url。
- 304:使用协商缓存
- 400:发送的请求错误,请求格式错误,或者没有服务器要求的数据。
- 401:没有权限访问,当前用户没有权限访问此资源。
- 403:请求被服务器禁止。
- 404:请求的 url 不存在,一般是 url 出错。
- 500:服务器处理请求出现错误。
- 501:服务器超出能力之外的方法,例如:请求的方法服务器不支持。
- 504:来自网关或者代理服务器,请求资源服务器时超时。
HTTP2:解决HTTP延迟高的问题
- 延迟高的原因:请求-响应模型、头部巨大且重复、并发连接耗时、服务器不能主动推送等
解决方法与针对的问题
- 头部压缩:Cookie、User Agent、Accept 头部字段内容太大
- 二进制帧:字段传输速度,便于位运算
- 并发传输:缓解了队头阻塞问题(没有解决)
- 服务端主动推送资源
方法细节
- 头部压缩:使用Hpack算法,静态字典/动态字典/哈夫曼编码。客户端和服务器两端都会建立和维护「字典」,用长度较小的索引号表示重复的字符串,再用 Huffman 编码压缩数据,可达到 50%~90% 的高压缩率。
- 二进制帧:响应报文划分成了两类帧,包括 首部 和 DATA(负载),也就是说一条 HTTP 响应,划分成了两类帧来传输,并且采用二进制来编码。
- 并发传输:使用 Stream 设计,多个 Stream 复用一条 TCP 连接,达到并发的效果
1 | - 1 个 TCP 连接包含一个或者多个 Stream,Stream 是 HTTP/2 并发的关键技术; |
- 服务端推送资源:客户端发起的请求,必须使用的是奇数号 Stream,服务器主动的推送,使用的是偶数号 Stream。服务器在推送资源时,会通过 PUSH_PROMISE 帧传输 HTTP 头部,并通过帧中的 Promised Stream ID 字段告知客户端,接下来会在哪个偶数号 Stream 中发送包体。
HTTP3: quic协议,使用HTTP2 + TLS + UDP
HTTP2存在问题:
- TCP层的队头阻塞问题:HTTP/2 多个请求是跑在一个 TCP 连接中的,那么当 TCP 丢包时,整个 TCP 都要等待重传,那么就会阻塞该 TCP 连接中的所有请求。
- TCP 是字节流协议。TCP 层必须保证收到的字节数据是完整且有序的,如果序列号较低的 TCP 段在网络传输中丢失了,即使序列号较高的 TCP 段已经被接收了,应用层也无法从内核中读取到这部分数据,从 HTTP 视角看,就是请求被阻塞了。
- TCP 与 TLS 的握手时延迟:TCP 由于具有「拥塞控制」的特性,所以刚建立连接的 TCP 会有个「慢启动」的过程,它会对 TCP 连接产生“减速”效果
- 网络迁移需要重新连接:
quic协议
- 无队头阻塞:传输层协议换成UDP,根本上避免了TCP的队头阻塞。
- quic协议会保证数据包的可靠性,每个数据包都有一个序号唯一标识。当某个流中的一个数据包丢失了,即使该流的其他数据包到达了,数据也无法被 HTTP/3 读取,直到 QUIC 重传丢失的报文,数据才会交给 HTTP/3。
- 而其他流的数据报文只要被完整接收,HTTP/3 就可以读取到数据。这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。
- 更快的连接建立:quic协议握手的方式:
- QUIC 内部包含了 TLS,它在自己的帧会携带 TLS 里的“记录”,再加上 QUIC 使用的是 TLS 1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与密钥协商,甚至在第二次连接的时候,应用数据包可以和 QUIC 握手信息(连接信息 + TLS 信息)一起发送,达到 0-RTT 的效果。
- 连接迁移:没有用四元组的方式来“绑定”连接,而是通过连接 ID 来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感。
网页解析HTTP请求:
输入url
DNS解析,就近原则,如果本地DNS服务器的缓存中没有,就发到DNS根服务器,
- 根DNS服务器返回的报文,告诉本地DNS,这个域名由哪个顶级DNS服务器负责,本地去这个顶级(比如.com)服务器去查询
- 顶级返回次级地址,次级返回次次级,最后返回目标IP,本地DNS缓存更新这个IP
- 其中用户使用的DNS服务器默认是运营商提供的本地域名解析器,检查自己的缓存
建立TCP连接,经过三次握手 1.C->S发送握手请求,附带一个SEQ=x,2.S->C发送收到,福袋一个ACK=x+1,和另一个SEQ=y ,3. C->S发送一个ACK=y+1 ,SEQ =x+1,上一个ACK,结束SYN-RECV阶段,并进入establish阶段/
释放连接,经过四次挥手 1.
网页解析HTTPS请求:先建立TCP,再建立SSL加密
输入url,三次握手完成TCP通信建立
客户端发送https请求到服务端
服务端发回SSL证书和公钥到客户端
客户端验证证书安全性,如果安全,生成对称密钥,把这个密钥用公钥发回服务端
服务端用自己的私钥解密,这样两者都有了session key,后面的传输都是通过这个对称加密进行的
HTTP1.1的长连接是怎样建立的
响应头中包含了 Connection: keep-alive 字段,那么它表示愿意保持连接开启,后续的请求都会通过上一个连接发送
HTTP方法:POST GET的区别:get提交数据在url后,post在body中;get具有幂等性,post不具有
GET 方法具有幂等性,指同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。
POST不具有幂等性。
get 提交的数据会放在 url 之后,post 提交的数据放在 body 上。
get请求参数会以 url 的形式完整的保留在浏览器的记录里,会存在安全问题。而 post 数据放在请求主体中,且数据不会被浏览器记录,相比 get 方法,post 方法更安全,主要用于修改服务器上的资源。post 可以进行复杂的加密,get 则不可以
get 只支持 ASCII 字符格式的参数,而 post 方法没有限制。
get 提交的数据大小有限制(这里所说的限制是针对浏览器而言的),而 post 方法提交的数据理论上没限制
get 方法具有幂等性,post 方法不具有。
幂等性,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。post方法有时会发送两个 tcp 数据包,与浏览器有关
- 使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。
- 而 GET 方法 Header 和 Data 会一起发送
XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。
长连接:减少 TCP 连接的重复建立和断开所造成的额外开销,减轻服务器端的负载。
- 管道传输【一般不使用】:在同一个 TCP 连接里面,客户端可以发起多个请求:只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间
- 队头阻塞问题:当顺序发送的请求序列中的某个请求阻塞时,后面的请求也会一直被阻塞。
2. 传输层
UDP
UDP头部包含8个字节64位
UDP头部的格式如下:
源端口 (16位):用于标识发送方的端口号。
目标端口 (16位):用于标识接收方的端口号。
长度 (16位):指示UDP报文头部和数据的总长度,以字节为单位,最小值为8(只有头部)。
校验和 (16位):用于检测UDP报文是否在传输过程中发生了错误。
TCP
TCP头部包含20个字节。握手挥手时,数据字段为空
*为什么要进行三次握手 ?
确认客户端和服务端都可以正常发送接收数据。
- 第一次握手:确认客户端可以正常发送数据。
- 第二次握手:确认客户端可以正常发送数据,确认服务端可以正常接收数据。
- 第三次握手:确认客户端可以正常发送数据,确认服务端可以正常接收数据,确认服务端可以正常发送数据,客户端可以正常接收数据。
三次握手过程中网络断开,会出现什么情况
第一次握手丢失:客户端没收到第二次握手,触发超时重传机制,发送第一次握手
第二次握手丢失:客户端依然没收到第二次握手,触发超时重传,发送第一次握手;服务端没有收到第三次握手,超时重传,发送第二次握手
第三次握手丢失:客户端establish状态,服务端没有收到第三次握手,超时重传,仍然发送第二次握手
超时重传的限度:发送一定次数N,这个次数由内核限制,linux为5次。
为什么要进行四次挥手 ?
第一次挥手:客户端向服务端请求关闭连接。
- 客户端:客户端无数据传输。
- 服务端:无感知。
第二次挥手:服务端收到客户端的请求,并且告知客户端等我处理完毕数据。
- 客户端:客户端无数据传输。
- 服务端:客户端无数据传输。
第三次挥手:服务端处理完毕数据,告知客户端,服务端数据处理完毕。
- 客户端:客户端无数据传输,服务端无数据传输。
- 服务端:客户端无数据传输,服务端无数据传输。
第四次挥手:客户端得知服务端数据处理完毕,双方数据都处理完毕,可断开连接。
- 客户端:客户端无数据传输,服务端无数据传输。
- 服务端:客户端无数据传输,服务端无数据传输,得知客户端知道服务端无数据传输。
*TCP是如何保证可靠传输的
1 数据分块
应用数据被分割成 TCP 认为最适合发送的数据块。并且给每一个数据块进行编号,在传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答,即发送 ACK 报文,这个 ACK 报文当中带有对应的确认序列号,如果发送过程中,存在数据块丢失或者发送重复,接收方根据序列号整理数据块,删除重复的数据块,要求发送方重新发送丢失的数据块。
2 校验和
与UDP 校验和相同,监测数据传输过程中可能出现的差错。
3 流量控制
让发送方的发送速率不要太快,让接收方来得及接收,TCP 连接的双方都有一个固定大小的缓冲空间,发送方发送的数据量不能超过接收端缓冲区的大小。当接收方来不及处理发送方的数据,会提示发送方降低发送的速率,防止产生丢包。TCP 通过滑动窗口协议来支持流量控制机制。
4 ARQ协议
ARQ(Automatic Repeat-reQuest)自动重传协议:每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
5 超时重传
当 TCP 发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果超过某个时间还没有收到确认,将重发这个报文段。
6 拥塞控制
在实际的网络通信系统中,除了发送方和接收方外,还有路由器,交换机等复杂的网络传输线路,此时就需要拥塞控制。拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。常用的解决方法有:慢开始和拥塞避免、快重传和快恢复。
慢开始:当发送方开始发送数据时,由于一开始不知道网络负荷情况,如果立即将大量的数据字节传输到网络中,那么就有可能引起网络拥塞。一个较好的方法是在一开始发送少量的数据先探测一下网络状况。慢开始的慢指的是初始发送报文段的数量为 1,如果收到确认,则发送两个报文段,之后每收到一个确认报文,发送报文端的数量就翻倍,直到到达慢开始门限,当发送报文段的数据大于门限数量时,使用拥塞避免算法。
拥塞避免:当网络拥塞发生时,慢开始门限值减半,发送的报文段数量改变为 1 ,然后再次重复两种算法(慢开始和拥塞避免)。
快重传:接收方每收到一个失序的报文就立即发送重复确认,而不要等到自己发送数据时才捎带进行确认,假定发送方发送了 Msg 1 ~ Msg 4 这 4 个报文,已知接收方收到了 Msg 1,Msg 3 和 Msg 4 报文,此时因为接收到收到了失序的数据包,按照快重传的约定,接收方应立即向发送方发送 Msg 1 的重复确认。 于是在接收方收到 Msg 4 报文的时候,向发送方发送的仍然是 Msg 1 的重复确认。这样,发送方就收到了 3 次 Msg 1 的重复确认,于是立即重传对方未收到的 Msg 报文。由于发送方尽早重传未被确认的报文段,因此,快重传算法可以提高网络的吞吐量。
快恢复
快恢复算法是和快重传算法配合使用的,该算法主要有以下两个要点:
① 当发送方连续收到三个重复确认,执行乘法减小,慢开始门限值减半;
② 由于发送方可能认为网络现在没有拥塞,因此与慢开始不同,发送报文段的数量减半,然后执行拥塞避免算法,线性增加发送报文段的数量。
quic协议
QUIC(Quick UDP Internet Connections),是一种基于 UDP 的传输层协议。QUIC = HTTP/2 + TLS + UDP.
3. 网络层
IP
A 类地址:10.0.0.0~10.255.255.255
B 类地址:172.16.0.0~172.31.255.255
C 类地址:192.168.0.0~192.168.255.255
解决IPv4不够用的两种技术:
- nat(network address translation)网络地址转换协议:将内网地址转为公网ip的协议,实现多层网络地址转换。
- IPv6 128位,比IPv4的32位多了四倍
链路层
ARP协议
arp(address resolution protocol) 地址解析协议:根据主机的ip 地址获取主机的mac 地址。每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
A要发送B一个数据包,首先他有B的IP地址,为了发送成功还需要B的MAC地址。
- 首先A查找本地ARP缓存,IP:MAC的映射
- 如果找到MAC 地址,就可以发送消息。
- 如果没有,A就会发送一个局域网广播的ARP请求B的MAC的数据包,这个消息被局域网内所有的计算机接受,B返回一个包含自身MAC和IP地址的ARP响应消息。作为响应请求的一部分,B 可以将 A 的一个条目插入到它的 ARP 表中,以备将来使用。
MAC地址
- MAC 地址是数据链路层和物理层使用的地址,是写在网卡上的物理地址。MAC 地址用来定义网络设备的位置。
- IP 地址是网络层和以上各层使用的地址,是一种逻辑地址。IP 地址用来区别网络上的计算机。
互联网中主机之间相互传递数据的逻辑是,先通过 ip 地址找到对应的局域网,然后再找到对应的主机。 - 如果只采用 ip 地址,不用mac 地址:不安全, 同一个ip 地址可能绑定多个主机,而无论何时mac 地址和主机是一一对应的。
找不到主机号,IP本质上相当于逻辑地址,两个主机可能有一个IP - 如果只采用mac 地址,不用ip 地址:没有办法使用ip 通过网段寻找目标主机,需要在全网段内没有规律的找一个主机,效率太慢。
一个是不够用,二是没有IP网段,全网查找,没有规律
WebSocket
- 使用最广泛的HTTP/1.1,也是基于TCP协议的,同一时间里,客户端和服务器只能有一方主动发数据,这就是所谓的半双工。
1. 正向代理和反向代理
- 正向代理是为了隐藏客户端信息例如ip,反向代理是为了隐藏服务器信息,例如ip。
- 正向代理是有感知的(就是说你需要用vpn你需要自己去配置),反向代理是无感知的(只需要输入www.baidu.com就可以访问到百度不同服务器上的资源,配置过程不是用户去做的)。