LOADING

加载过慢请开启缓存,浏览器默认开启

interview shit network

reference from(https://ac.nowcoder.com/discuss/982903?type=5)

1.网络体系

OSI七层体系结构

分层 作用 协议
物理层 通过媒介传输比特,确定机械及电气规范(比特bit) RJ45、Clock、IEEE802.3(中继器,集线器)
数据链路层 把比特组成帧,然后进行p2p的传递 PPP,VLAN,MAC(网桥,交换机)
网络层 负责数据包从源到宿的传递和网际互连(包packet) IP,ICMP,RIP,IGRP

传输层|提供端到端的可靠报文传递和错误恢复(段Segment)|TCP,UDP,SPX|
|会话层|建立、管理和终止会话(会话协议数据单元SPDU)|NFS,SQL,RPC|
|表示层|对数据进行翻译、加密和压缩|JPEG,MPEG,ASII|
|应用层|允许访问OSI的手段|FTP,DNS,SMTP,WWW,NFS|

五层协议

应用层 传输层 网络层 链路层 物理层

2. HTTP

HTTP是超文本传输协议(HTTP 是在计算机世界的协议。它使计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)。

特点
1.无连接的协议,发送完消息后需要重连

2.能够传输各种各样的数据,只要双方的机器能够阅读

3.无状态的协议,发完就溜

和HTTPS的区别

1.HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。

2.使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。

3.HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。

4.http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。

HTTP的进化

协议 特征 缺点
HTTP/1.0 无状态+无连接
HTTP/1.1 1.长连接:增加了一个connection的字段,通过keep-alive可以保持连接不断开
2.请求管道化,是得请求能够并行传输,把请求队列迁移到服务器。
3.加入了缓存处理,有了新的字段cache-control 4.多TCP连接
仍然无法解决头阻塞的问题(后面的请求必须等待前面请求的response)
HTTP/2.0 1.加入了帧和流的概念,采用二进制格式而非文本格式传输。
2.对每个流赋予对应的流id,所以不会阻塞
3.加入了server push,可以一次发送多个文件。
4.header压缩
1. server push可能被滥用。
2.混合模式的时候可能更慢,后端(支持HTTP2)和负载均衡(不支持HTTP2)不匹配
HTTP/3.0 1.传输层采用了新的协议QUIC
2.在UDP的基础上开发,所以如果有stream里的数据丢失,可以快速重传(QUIC每发送一组数据就对这组数据进行异或运算,并将结果作为一个校验和包发送出去。如果前面这组数据中出现了丢包的情况,就可以通过校验和与其他包来还原出丢包的数据,避免了重传带来的损耗。),并且第一次连接的时候也不需要三次握手了,直接tLS就行了

常用的HTTP请求方式以及区别

方法 特点
GET 1.无法改变server
2.可缓存,请求的数据附加在URL之后,用?分割,多数据用&连接
3.URL编码格式采用ASCII编码而非unicode,所有的非ASCII字符都需要编码后再传输
4.总的来说,在少量数据的时候用
5.安全性比较低z wzw
POST 1.可以改变server
2.不可缓存,请求数据在HTTP的body里

常见的HTTP状态响应码

分类 描述 例子
1** 信息,服务器收到请求,需要请求者继续执行操作 100:继续,客户端应该继续请求。
101:切换协议,服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
2** 成功,操作被成功接收并处理 200:OK
201:已创建,成功请求并创建了新的资源
202:已接受。已经接受请求,但未处理完成
3** 重定向,需要进一步的操作以完成请求 301:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302:此响应代码表示所请求资源的 URI 已 暂时 更改。未来可能会对 URI 进行进一步的改变。因此,客户机应该在将来的请求中使用这个相同的 URI。
4** 客户端错误,请求包含语法错误或者无法完成请求 400:客户端请求的语法错误,服务器无法理解
401 :请求要求用户的身份认证
5** 服务器错误,服务器在处理请求的过程中发生了错误 500:服务器内部错误,无法完成请求
501:服务器不支持请求的功能,无法完成请求

3.三次握手

客户端               状态:CLOSED                服务端               状态:CLOSED
  |                                     |
  |--------- SYN(seq=x) ------------->  |             监听连接请求
  |             状态:SYN-SENT           |
  | <------ SYN(seq=y),ACK(seq=x+1)---- |             等待连接请求
  |             状态:SYN-RECEIVED       |
  |--------- ACK(seq=y+1,ack=x+1)-----> |             确认连接请求,准备传输数据
  |             状态:ESTABLISHED        |
  |                                     |

1.第一次握手:客户端向服务器发送SYN信息,SYN设置为1 序列号seq=x,第一次握手后客户端为SYN-SENT,服务端为LISTEN

2.第二次握手:服务端收到客户端报文后,随机生成一个起始序列号y,然后给客户端恢复一段报文,其中SYN=1,ACK=1,序列号seq=y,确认号ack=x+1此时服务端状态变为SYN-RCVD

3.客户端收到服务端的豹纹后,会再向服务端发送报文

avator

不进行三次握手可能发生这些情况

1.资源浪费

假设客户端向服务端发送了一个连接请求,但是服务端由于网络问题等原因没有收到请求,而客户端在等待服务端响应时,一直占用着本地的资源,比如说占用了一个端口号,这样就会导致其他客户端无法使用这个端口号,从而浪费了资源。而服务端在没有收到请求的情况下,也可能会占用一些资源,比如说占用了一个线程等待请求的到来,从而浪费了服务器的资源。

2.数据混乱

假设客户端发送了一个请求,但由于网络延迟等原因,服务端接收到了多个请求,此时客户端会认为连接已经建立成功,开始发送数据,但由于服务端接收到了多个请求,所以不知道客户端发送的具体数据是哪个请求对应的,就会导致数据传输的混乱,从而造成数据的重复发送或丢失。

3.安全问题

假设客户端发送了一个连接请求,但这个请求是由黑客伪造的,黑客可以伪造一个IP地址和端口号,从而欺骗服务端,让服务端认为是合法的请求,如果没有进行握手,就无法验证请求的真实性,这样就有可能会访问到服务端的敏感信息,比如说数据库密码等。

三次握手的字段交换

除了ACK SYN SEQ之外,还有TCP头部和IP头部等协议头部信息

两次握手行不行

不行,如果服务端发送的ACK+SYN丢失,那么会出现问题

4.四次挥手

客户端             状态:ESTABLISHED          服务端             状态:ESTABLISHED
  |                                         |
  |--------- FIN(seq=x) --------------->   |             客户端发送FIN报文段,请求关闭连接
  |             状态:FIN-WAIT-1            |
  | <------ ACK(seq=x+1,ack=y) ---------- |             服务端返回ACK报文段,确认收到FIN报文段
  |             状态:FIN-WAIT-2            |
  |                                         |
  |                                         |
  | <------ FIN(seq=y) ------------------ |             服务端发送FIN报文段,请求关闭连接
  |             状态:TIME-WAIT             |
  |--------- ACK(seq=y+1,ack=x+1) ----->   |             客户端返回ACK报文段,确认收到FIN报文段,进入TIME-WAIT状态
  |             状态:CLOSE-WAIT            |
  |                                         |
  |                                         |
  |             状态:LAST-ACK              |             客户端发送ACK报文段,终止连接
  | <------ ACK(seq=x+1,ack=y+1) ----------|             服务端进入CLOSED状态
  |                                         |
  |                                         |

1.A的应用进程先向其TCP发出连接释放报文段(FIN=1,seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。

2.B收到连接释放报文段后即发出确认报文段(ACK=1,ack=u+1,seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。

3.A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

4.B发送完数据,就会发出连接释放报文段(FIN=1,ACK=1,seq=w,ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。

5.
A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL(最大报文段生存时间)后,A才进入CLOSED状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。

三次挥手行不行

具体来说,当客户端发送最后一个ACK报文,告知服务端自己已经完成数据的接收,服务端会进入LAST_ACK状态,等待客户端的确认。如果这个ACK报文丢失了,服务端就无法得知客户端已经完成关闭,因此无法将自己的连接释放,这就导致了“半开(half-open)”连接,即服务端仍然会认为自己和客户端的连接是打开状态,浪费了网络资源。

为了解决这个问题,四次挥手增加了一个额外的ACK报文,即最后一个ACK报文,以确保双方都能确认连接已经关闭。

浏览器中输入URL返回页的过程

1、解析URL得到发送给web的信息,并生产 HTTP 请求信息

2、查询服务器域名对应的** IP 地址,这个过程中涉及到DNS解析。

3、通过 DNS 获取到 IP 后,就可以把 HTTP 的传输⼯作交给操作系统中的协议栈。

4、经过TCP三次握手建立连接进行数据传输。

5、TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。

6、生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。

7、后续还会经过网卡、交换机和路由器到对端,然后就是一个反向的过程。

TCP UDP区别

种类 特点
TCP 1.面向连接
2.提供可靠的服务
3.面向字节流
4.有拥塞控制
5.每一条TCP连接只能是1对1的
6.首部开销20字节
UDP 1.不面向连接,无连接的,即发送数据前不需要建立连接
2.不保证可靠交付
3.面向报文的
4.没有拥塞控制,网络出现拥塞不会让源主机的发送速率降低
5.UDP支持一对一,一对多和多对多的通信方式
6.UDP首部开销小,只有8个字节

TCP的拥塞控制

用于防止过多的数据注入到网络中
慢开始、拥塞避免、快重传、快恢复
|类型|特点||
|-|-|-|
|慢启动|先把拥塞窗口设置为一个最大报文段的数值,然后按指数加倍,到达门限后,按照线性增加||
|拥塞避免|每次发送方发现网络出现拥塞,先把上限设置为出现拥塞的一半然后把当前cwnd重新设置为1,然后重新执行慢启动算法||
|快速重传|接收方每收到一个失序的报文就立刻发出重复确认,发送方收到三个连续重复确认后,把门限减半,然后吧cwnd设置为慢开始门限减半后的数值,然后重新执行线性增加||

区别 coockie session token
存储位置 客户端 服务器 服务器
存储内容 存储少量的文本信息,如用户ID、用户名 可以存储更多的用户信息,包括登录状态、权限信息等 可以存储更多的用户信息,包括登录状态、权限信息等
安全性 由于Cookie存储在客户端,因此可能存在安全风险 Session和Token存储在服务器端,因此比Cookie更安全。 Session和Token存储在服务器端,因此比Cookie更安全。
过期时间 Cookie可以设置过期时间 Session通常在用户关闭浏览器时就会自动过期 Token通常具有较长的过期时间,可以用于长期的身份验证
访问限制 Cookie存储在客户端,因此客户端可以直接访问和修改Cookie Session和Token存储在服务器端,客户端无法直接访问和修改Session和Token。
适用范围 Web应用程序 Web应用程序 Web服务和API