当前位置: 首页 > news >正文

【复习】计算机网络

网络模型

OSI

  • 应用层:给应用程序提供统一的接口
  • 表示层:把数据转换成兼容另一个系统能识别的格式
  • 会话层:负责建立、管理、终止表示层实体之间的通信会话
  • 传输层:负责端到端的数据传输
  • 网络层:负责数据的路由、转发、分片
  • 数据链路层:负责数据的封帧和差错检测,以及MAC寻址
  • 物理层:负责在物理网络中传输数据帧

TCP/IP模型

  • 应用层:支持HTTP、SMTP等最终用户进程
  • 传输层:处理主机到主机之间的通信
  • 网络层:寻址和路由数据包
  • 链路层:通过网络的物理电线或无线信道移动比特

TCP在传输层;IP在网络层

应用层

应用层的协议?

HTTP、HTTPS、CDN、DNS、FTP

HTTP报文有哪几部分?

请求报文:

  • 请求行:请求方法、目标、HTTP版本
  • 请求头:请求的附加信息(Host、User-Agent…)
  • 空行:请求头和请求体之间用空行空格
  • 请求体:请求的数据,用于POST请求需要传输数据的情况

响应报文:

  • 状态行:HTTP协议、状态码、状态信息
  • 响应头:响应的附加信息(Content-Type、Content-Length…)
  • 空行:响应头和响应体之间用空行空格
  • 响应体:包含响应的数据(服务器返回的HTML、JSON…)

HTTP常用状态码

  • 1xx:提示信息,协议处理的中间状态,还需要后续操作(少用)

  • 2xx:成功,报文已收到并被正确处理(200、204、206)

  • 3xx:资源重定向,资源位置发生变动,需要客户端重新用新的URL发请求(301、302、304)

    • 301 - 永久重定向,说明请求的资源已经不存在了,需要改用新的URL再次访问
    • 302 - 临时重定向,说明请求的资源还在但是暂时需要用另一个URL访问

    301 和 302都会在响应头指明后续要跳转的URL

  • 4xx:客户端错误,请求报文有误,服务器无法处理(400、403、404、405)

    • 404 - 无法找到此页面
    • 405 - 请求的方法类型不支持
  • 5xx:服务器错误(500、501、502、503)

    • 502 - 服务器执行请求时,从上游服务器接收到无效的响应
    • 504 - 服务器执行请求时,未能及时从上游服务器收到响应

nginx是代理服务器,收到客户端请求后,将请求发到后端服务器;

  • 502:nginx收到无效的响应
  • 503:请求超时(超过了nginx的配置时间)

GET和POST的区别

GET:从服务器获取资源,请求参数写在URL位置(URL只支持ASCII且浏览器对URL的有限制)

POST:根据body对指定的资源做处理,携带的数据写在body里。

GET是安全、幂等的(只读),可以对GET数据做缓存,可以缓存到浏览器上,也可以缓存到nginx上,在浏览器中GET请求可以保存为书签。

POST是不安全、不是幂等的(写),浏览器一般不会缓存POST请求,也不能把POST请求保存为书签

实际开发中,也会用POST方法实现查询数据的请求

HTTP长连接

HTTP协议是“请求-响应”模式,先建立TCP连接,客户端发起了HTTP请求,服务器收到后就返回响应,然后释放TCP连接。

HTTP短连接:一次连接只能请求一次资源

HTTP长连接(Keep-Alive):使用同一个TCP连接来发送和接收多个HTTP请求,避免了连接建立和释放的开销。只要任何一段没有明确提出断开连接,则保持TCP连接状态。

HTTP怎么对请求做拆包的?

请求的拆包是通过“Content-Length”头字段来进行的。该字段指示了请求正文的长度,服务器可以根据该长度来正确接收和解析请求。

  1. 客户端发送HTTP请求,会在请求头中增加“Content-Length”字段,用来表示请求正文的字节数
  2. 浏览器根据“Content-Length”字段来确定请求的长度,并从请求中读取相应数量的字节,直到读取完整个请求的内容

HTTP为什么不安全?

HTTP是基于明文传输的,通信链路上可以获取通信内容;其他用户可以篡改内容;也可以冒充发送方。

HTTPS是在HTTP和TCP层之间引入了SSL/TLS协议,解决了上述风险。

HTTP 和 HTTPS的区别?

  1. HTTP是超文本传输协议,存在安全风险;HTTPS解决了HTTP不安全的缺陷,在TCP和HTTP之间加入了SSL/TLS协议
  2. HTTP建立相对简单,通过TCP三次握手后就可以进行HTTP的报文传输;HTTPS在TCP三次握手后还需要建立SSL/TLS的握手才能进行加密报文传输
  3. HTTP默认端口80;HTTPS默认端口443
  4. HTTPS需要向CA申请数字证书,来保证服务器的身份是可用的

TLS的四次握手过程?

  1. 第一次握手:客户端向服务器发起加密通信请求(ClientHello),主要发送以下信息:

    • 客户端支持的TLS协议版本
    • 客户端生成的随机数(后边用于生成会话秘钥)
    • 客户端支持的密码套件列表(RSA加密算法)
  2. 第二次握手:服务器收到客户端请求后,向客户端发出响应(ServerHello),主要回应以下信息:

    • 确认TLS协议版本
    • 服务器生成的随机数(后边也是用于生成会话秘钥)
    • 确认的密码套件列表(RSA加密算法)
    • 服务器的数字证书
  3. 第三次握手:客户端收到服务器回应后,通过浏览器或操作系统里的CA公钥,确认服务器的数字证书的真实性。整数如果没有问题,就会从数字证书里取出服务器的公钥,用它加密报文,向服务器发送以下信息:

    • 一个随机数(会被服务器公钥加密)
    • 加密通信算法改变通知(告知服务器随后的信息都会用“会话密钥”加密通信)
    • 客户端握手结束通知(表示客户端的握手已经结束)

    通过这三个随机数,接着用双方协商的加密算法,各自生成本次通信的“会话密钥”

  4. 第四次握手:服务器通过协商的加密算法,计算出本次通信的“会话密钥”,向客户端回应以下消息:

    • 加密通信算法改变通知(告知客户端随后的消息都会用“会话密钥”加密通信)
    • 服务器握手结束通知(表明服务器的握手已经结束)

整个TLS的握手全部结束后,服务器与客户端就会进入加密通信,完全是使用普通的HTTP协议,只不过用“会话密钥”加密内容

HTTPS如何防范中间人攻击?

  • 加密:https握手期间会通过非对称加密方式协商出对称加密密钥
  • 身份验证:客户端与服务器建立连接后,服务器会将CA证书发送给客户端,客户端会去校验CA整数的合法性。验证通过后,使用证书中的公钥来加密数据,并将加密后的数据传给服务器,服务器用私钥解密

中间人的攻击在于冒充服务器与客户端建立连接,但是中间人拿不到服务器的私钥,无法正确解密客户端发过来的数据。同时如果客户端校验CA证书后,证书验证失败,也会中断连接。

HTTP1.1 和 HTTP2.0的区别?

  1. 头部压缩:HTTP2会压缩头部,如果发送多个请求,他们的请求头部是一样的,协议会帮忙消除重复的部分。

HPACK算法:客户端和服务器同时维护一张头部信息表,所有的字段都存入这个表中,并生成一个索引号,以后就不会发送同样的字段,直接发送索引号即可。

  1. 二进制格式:HTTP1.1采用的是纯文本形式的报文;HTTP2全面采用了二进制格式。增加了数码据传输的效率
  2. 并发传输:多个Stream复用在同一条TCP连接上,解决了HTTP1.1队头阻塞的问题
  3. 服务器主动推送资源:服务器不再是被动的响应,可以主动向客户端发送消息

HTTP进行TCP连接之后,什么情况下会断开连接?

  1. 客户端 或 服务器发送一条FIN报文,就会进行四次挥手
  2. 发送方发送了一条数据给服务器,服务器超过一段时间没有响应ACK报文,发送方重传达到最大次数时,就会断开TCP连接
  3. HTTP长时间没有进行请求和响应。

HTTP、SOCKET和TCP的区别?

  • HTTP:应用层协议,定义了客户端和服务器之间交换数据的规则;在客户端和服务器之间传输和显示web页面
  • Socket:用于描述通信链路的一端,提供了底层的通信接口,可实现不同计算机之间的数据交换
  • TCP:传输层协议,负责在网络中建立可靠的数据传输连接

DNS是什么?

DNS是用来将域名转化成IP地址的数据库系统,端口号53。(越靠右层级越高)

  • 根域名服务器
  • 顶级域名服务器
  • 权威域名服务器

DNS底层是基于UDP协议的,因为UDP可以提供低延迟的特性,更适合DNS这种需要快速响应的域名解析服务。

虽然UDP存在丢包和数据包损坏的风险,但是DNS使用一些机制来提高可靠性(超时重传、请求重试、缓存…)

DNS域名解析流程?

  1. 客户端发送DNS请求,发送给本地域名服务器
  2. 本地域名服务器先去查询缓存,如果查到,直接返回IP地址;如果没有查到,就进行迭代查询
    • 本地域名服务器去访问他的根域名服务器,根域名服务器并不会进行域名解析,而是告诉它顶级域名服务器的IP地址
    • 本地域名服务器又去访问顶级域名服务器,顶级域名服务器也不会进行域名解析,而是告诉它权威域名服务器的IP地址
    • 本地域名服务器又去访问权威域名服务器,权威域名服务器是域名解析结果的原出处,将该域名对应的IP地址告诉本地域名服务器,随后本地域名服务器将IP地址返回给客户端,成功建立连接。

HTTP是无状态的吗?

HTTP是无状态的,服务器不会在多个请求中保留客户端状态的信息,在每个HTTP请求中,服务器不会记住之前的请求和会话状态,每个请求都是独立的。

可以通过一些机制来实现状态保持,例如:使用Cookie和Session来跟踪用户的状态。

通过在客户端存储会话信息,服务器可以识别和跟踪特定用户的状态。

携带Cookie的HTTP是有状态的,Cookie是用来在客户端存储会话信息和状态信息的,通过使用Cookie可以实现一定程度的状态保持功能。

Cookie是HTTP协议簇的一部分,只是无状态协议下的一种补充,用来在客户端存储状态信息以实现状态保持。

Cookie和Session的区别

  1. 存储位置:Cookie存储在客户端,浏览器向服务器发请求时,会自动携带Cookie;Session存在服务器,服务器为每个用户分配一个SessionId,通过Cookie的方式发送给客户端,客户端的后续请求都会携带SessionId,服务器根据SessionId找到对应的数据
  2. 数据容量:单个Cookie大小限制在4KB左右;Session存储在服务器上,主要受限于服务器内存大小
  3. 安全性:Cookie存储在客户端,相对不安全;Session存储在服务器,比Cookie安全
  4. 生命周期:Cookie可以设置过期时间,过期后自动删除,也可以设置会话Cookie,浏览器关闭后自动删除;Session在默认情况下,用户关闭浏览器时Session结束,服务器也可以设置Session的超时时间。

token、session、cookie的区别?

  1. session:存储在服务器,拥有一个唯一的SessionId,这个SessionId一般存放在Cookie中。服务器收到Cookie后会解析SessionId,再去Session列表中查找,找到对应的Session。

  2. Cookie:类似于一个令牌,装有SessionId,存储在客户端,浏览器一般会自动添加

  3. Token:类似一个令牌,无状态,用户信息都被加密到Token中,服务器收到Token后解密就可以知道是哪个用户,需要开发者手动添加。

客户端如果禁用了Cookie,Session也无法正常使用,因为大部分的服务器都是依赖Cookie来传递sessionId。

数据存储在localStorage和Cookie有什么区别?

  1. 存储容量:Cookie的存储容量小;LocalStorage的存储容量通常较大(存储大量数据时,LocalStorage更合适)
  2. 数据发送:Cookie在每次请求时都会自动发送到服务器,适合在服务器和浏览器中传输数据;LocalStorage不会自动发送数据,只在浏览器中存储数据,更适合于同一个域名下不同页面之间共享数据
  3. 生命周期:Cookie可以设置过期时间;LocalStorage的数据将永远存在浏览器中,除非通过js代码手动删除
  4. 安全性:Cookie的安全性低,因为Cookie每次请求都会发送给服务器,存在监听和篡改的风险;LocalStorage的数据只存储在浏览器中,相对更安全。

JWT和传统方式的区别?

  1. 无状态:JWT时无状态的令牌,不需要在服务器存储会话信息。JWT令牌中包含了所有必要的信息。
  2. 安全性:JWT使用秘钥对令牌进行签名,保证令牌的完整性和真实性。
  3. 跨域:JWT令牌可以在不同域之间传递,可以实现无需Cookie的跨域身份验证。

JWT令牌由:头部、载荷、签名三部分组成。

头部、载荷:JSON格式,使用Base64编码进行序列化

签名:对头部、载荷、秘钥进行签名后的结果

JWT的缺点?

JWT一旦派发出去,在失效之前都是有效的,没法即使撤销JWT

解决:在业务层增加判断逻辑,比如:添加黑名单机制。使用Redis维护一个黑名单,如果让某个JWT失效就直接把这个JWT加入黑名单中,每次使用前就判断这个JWT是否存在黑名单中。

前端如何存储JWT?

传统方式:

  1. 浏览器向服务器发起请求
  2. 服务器在当前会话(session)里保存相关数据,并返回一个sessionId
  3. 浏览器拿到sessionId后会存入Cookie,以后每次发请求都会携带Cookie。
  4. 服务器拿到Cookie后会解析出sessionId,并通过这个sessionId找到前期保存的数据。

如果是服务器集群情况下,就需要session共享数据,使得每个服务器都可以读取到session

优化:

服务器不存储session数据,所有数据都保存在客户端,每次请求都会发回服务器,客户端收到服务器返回的JWT后,可以存储在LocalStorage里,也可以存储在Cookie里,还可以存储在SessionStorage里。

  • 存储在LocalStorage里:提供了较大的存储空间,不会随HTTP一起发送给服务器,但是恶意脚本可能可以通过JS代码访问到JWT(XSS攻击)。
  • 存储在Cookie里:设置HttpOnly标志来防止通过JS访问,减少XSS攻击的风险;但是单个Cookie只能存储4KB,并且每次HTTP请求都会携带Cookie
  • 存储在SessionStorage:当窗口关闭后,数据会被清除;但是用户的体验可能会受到影响,每次刷新页面都需要重新登陆。

HTTP长连接和WebSocket的区别?

  1. TCP协议是全双工的(HTTP1.1虽然是基于TCP的协议,但是他是半双工的;HTTP2是全双工的),HTTP1.1对于大部分需要服务器主动推送到客户端的场景都不太友好;而WebSocket是全双工的
  2. HTTP1.1里,只要客户端不发起请求,服务器就不会给响应。对于服务器和客户端之间需要频繁交互的复杂场景,可以考虑webSocket

传输层

TCP头部

  1. 序列号(seq):在建立连接时由计算机生成的随机数作为初始值,每发送一次数据,就累加一次该数据字节的大小。(用来解决网络包乱序的问题)

  2. 确认应答号(ack):下次“期望”收到的数据的序列号,发送端收到这个说明在这个序列号之前的所有数据都已被正常接收(用来解决丢包问题)

  3. 控制位:

    • ACK:1 - 确认应答号有效
    • RST:1 - TCP连接出现异常时必须强制断开连接
    • SYN:1 - 希望建立连接
    • FIN:1 - 希望断开连接

TCP三次握手

在这里插入图片描述

第三次握手可以携带数据,前两次握手是不可以携带数据的

一旦完成三次握手,双方都处于established状态,此时连接就已建立完成,客户端与服务器就可以互相发送数据了。

为什么TCP需要三次握手?

三次握手主要是为了防止旧的重复连接初始化造成混乱。

客户端如果连续发送了多个SYN建立连接的报文,

  • 在网络不好的情况下:“旧的SYN报文(seq = 90)”比“新的SYN报文(seq = 100)”早到达
  • 此时服务器先返回一个SYN+ACK的报文给客户端,客户端收到后,发现自己期望收到的应该是(100 + 1 = 101,而不是90 + 1),就返回RST报文。
  • 服务器收到RST报文后就会释放连接。
  • 等到新的SYN报文(100 + 1)到达后,服务器与客户端就可以完成三次握手了

如果只有两次握手无法防止旧的重复连接初始化。

客户端先后发了两个SYN报文,服务器收到了旧的SYN报文后,也往客户端发一个SYN+ACK的报文,如果只有两次握手,此时双方都已进入established状态,连接已建立。(因为需要浏览器这里判断ack和期望的不同,才会发送RST报文。)

TCP三次握手,在第三次握手中,客户端发送的确认包丢了怎么办?

因为第三次握手的ACK是针对第二次握手的SYN的确认报文,所以当第三次握手丢失了,如果服务器一直收不到,就会触发超时重传机制,直到收到三次握手。如果达到最大重传次数,服务器就会断开连接

TCP三次握手,在第一次握手中,客户端发送SYN报文丢失了怎么办?

客户端想和服务器建立连接,向服务器发送SYN报文,如果客户端一直收不到服务器的响应,就会触发超时重传机制,重传SYN报文(重传的seq序列号是一样的)如果达到最大重传次数,客户端就不再发送SYN报文,随后断开TCP连接

TCP三次握手,在第二次握手中,服务器的SYN + ACK报文丢失了怎么办?

  1. 因为第二次握手的ACK报文代表对第一次握手的确认,如果客户端没有收到第二次握手,会认为自己第一次握手的SYN报文丢失,客户端就会触发超时重传机制,重传SYN报文。如果达到最大重传次数,客户端就会断开连接。

  2. 如果第二次握手丢失,服务器收不到第三次握手,服务器这里也会触发超时重传机制,重传SYN+ACK报文,如果达到最大重传次数,服务器就会断开连接。

第一次握手,客户端发送SYN报文,第二次握手,服务器回复SYN+ACK报文,这个过程中服务器做了什么?

第二次握手:服务器收到客户端的SYN请求后,会把该连接存储到半连接队列,并向客户端发送SYN+ACK

第三次握手:客户端收到后,会发ACK报文给服务器,服务器收到第三次握手的ACK后,内核会把连接从半连接队列中移除,然后创建新的完全的连接,并添加到全连接队列,等待进程调用accept函数把连接从全连接队列中取出来。

如果有大量的SYN数据包从客户端发往服务器,会导致服务器那边的半连接队列满了,后续在收到SYN数据包就会丢弃。

TCP四次挥手

在这里插入图片描述

  1. 客户端主动关闭连接,发送FIN报文,代表客户端已经不会发送数据了,客户端进入FIN_WAIT_1状态
  2. 服务器收到SYN报文,回复ACK确认报文,此时服务器进入CLOSE_WAIT状态
  3. 此时服务器如果有数据要发送,就需要发送完数据才能关闭连接;如果没有数据要发送,就可以直接关闭连接。
  4. 服务器发完剩余的数据后,发送FIN报文,代表服务器也不会发送数据,此时服务器进入LAST_ACK状态
  5. 客户端收到FIN报文后,发送ACK确认报文给服务器,客户端此时进入TIME_WAIT状态
  6. 服务器收到ACK确认后,也进入CLOSE状态
  7. 客户端经过2MSL时间后,也进入CLOSE状态

为什么四次挥手中间两次不能变成一次?

因为服务器收到客户端的FIN报文时,需要立马响应ACK,但是此时服务器可能还有数据没有发完,所以不能马上发送FIN报文。因此四次挥手时,服务器的ACK和FIN一般都是分两次发送的。

第二次和第三次挥手之间,客户端不能发送数据,但是可以接收服务器还没发完的数据

断开连接时客户端FIN包丢失(第一次挥手不成功),服务器的状态是什么?

客户端向服务器发送FIN报文,如果发送的FIN报文丢失,客户端收不到服务器的ACK确认,就会触发超时重传机制,重传FIN报文,如果达到最大重传次数,客户端就会直接进入CLOSE状态,而服务器还是established状态。

为什么四次挥手要等2MSL?

MSL是报文最大生存时间,超过这个时间报文会被丢弃,因为TCP报文是基于IP协议,IP头有一个TTL字段(是IP数据包可以经过的最大路由跳数)

MSL的单位是时间,TTL是经过路由跳数,所以MSL应该大于等于TTL消耗为0的时间,保证报文已经被自然消亡。

等待2MSL,主要是因为网络中可能存在发送方的报文,这些发送方的数据包被接收方处理后,又会向对方发送响应。(一来一回需要等待2倍时间)

如果服务器没有收到客户端最后的ACK报文,那么就会触发服务器的超时重传,服务器会重新发送FIN报文,一来一回正好2MSL(相当于至少允许报文丢失一次)

TCP和UDP的区别?

  1. TCP面向连接,UDP无连接
  2. TCP一条链路只能由两个端点;UDP支持一对一、一对多、多对多
  3. TCP可靠交付数据;UDP尽最大努力交付(基于UDP传输协议实现一个可靠的传输协议:QUIC协议)
  4. TCP有流量控制和拥塞控制;UDP没有,即使网络拥堵,也不会影响UDP的发送速率
  5. TCP首部较长(20字节),长度不固定;UDP首部只有8字节,固定不变,开销小。
  6. TCP是流式传输,没有边界,但是要保证顺序和可靠;UDP是一个个包发送,有边界,可能会出现丢包和乱序。

TCP为什么可靠传输?

  1. 连接管理:三次握手、四次挥手建立可靠连接
  2. 序列号:既能保证可靠性,又能防止数据丢失,还能避免数据重复。
  3. 确认应答:接收方收到数据后,会发送ACK确认报文,报文中也会携带此次确认的序列号,如果未发送确认报文,就会触发超时重传机制。
  4. 超时重传:
    • 数据包丢失:指定时间内,发送方未收到确认应答,就会启动超时重传
    • 确认包丢失:接收方收到重复数据时丢弃,并重新回传ACK确认报文
  5. 流量控制:根据接收方处理能力,来决定发送发的发送速度(在TCP报文首部维护一个滑动窗口实现)
  6. 拥塞控制:当网络拥堵时需要减少数据发送(通过发送端维护一个拥塞窗口实现)

TCP粘包问题?

粘包问题主要是不知道用户消息的边界在哪,如果知道边界在哪,就可以通过边界来划分出有效的用户信息。

  1. 固定长度的消息【少用】:每个用户消息都是固定的(比如规定消息的长度是64字节,当接收方收到64个字节的数据,就会认为这个内容是一个完整的消息)
  2. 特殊字符作为边界:在两个用户的消息之间插入一个特殊字符,接收方收到数据后,读取到这个特殊字符,就认为已经读到了一个完整的消息。

如果消息里正好有这个字符,需要对消息里的字符做转义

  1. 自定义消息结构(包头 + 数据):包头大小固定,包头里有个字段是用来说明随后的数据有多大。接收方收到包头后,先解析包头的内容,得到数据的长度,然后接下来就继续读取数据,直到读满数据长度。

TCP的拥塞控制?

在网络出现拥堵的情况,如果发送大量的数据包,会导致数据包丢失,这时TCP就会触发重传机制,导致网络的负担更重,就会进入恶性循环。

拥塞控制就是避免发送方的数据填满整个网络。

发送方会维护一个拥塞窗口,拥塞窗口会根据网络的拥塞程度动态变化。

发送窗口= min(拥塞窗口, 接收窗口)

拥塞控制的四个算法:

  1. 慢启动:发送方每收到一个ACK,拥塞窗口 + 1(指数增加)
    • 当拥塞窗口达到慢启动门限,就会使用拥塞避免算法
  2. 拥塞避免:发送方每收到一个ACK,拥塞窗口 + 1/拥塞窗口(线性增长)
  3. 拥塞发生:当网络出现拥塞时(发生数据包重传时),就会触发重传机制
    • 超时重传:慢启动门限设置为当前拥塞窗口的一半,拥塞窗口直接设置为1
    • 快重传:拥塞窗口设置为原来的一半,慢启动门限等于当前拥塞窗口,进入快恢复
  4. 快恢复(一般和快重传同时使用)

网络场景

打开百度首页后发生了什么

  1. 解析URL:检查URL中是否出现了非法字符,对非法字符进行转义后处理

  2. 缓存判断:判断请求的资源是否在缓存里,如果在缓存里且没有失效,就会直接使用;如果失效会进行DNS解析

  3. DNS解析:如果资源不在缓存里,就进行DNS解析,先查询本地域名服务器,如果本地域名服务器能找到对应的ip地址,就返回;如果找不到,本地域名服务器就会分别迭代查询顶级域名服务器、根域名服务器、权威域名服务器,最后在权威域名服务器中找到ip地址返回

  4. 获取MAC地址:当浏览器得到ip地址后,数据传输还需要直到主机的MAC地址。

    • 因为应用层数据会往下传递给传输层
    • 在传输层又会下发给网络层
    • 网络层会将本机地址作为源地址,获取的ip地址作为目的地址,然后下发给数据链路层
    • 数据链路层需要得到双方的MAC地址,本机的MAC地址作为源地址,目的MAC地址需要分两种情况:
      • 如果源ip地址和目的ip地址在同一个子网下,可以使用ARP协议直接获取到目的主机的MAC地址
      • 如果源ip地址和目的ip地址不在同一个子网下,就将请求交给网关,由网关代为转发,也是通过ARP协议获取网关的MAC地址,此时目的MAC地址就是网关的MAC地址
  5. 建立TCP连接:

    • 使用目标IP地址和目标MAC地址发送SYN报文,请求建立TCP连接
    • 然后由路由器转发到目标服务器后,目标服务器恢复SYN_ACK报文
    • 客户端收到后,发送ACK包,表示收到服务器的确认,TCP连接建立完成

    如果使用的是HTTPS协议,在TCP三次握手之前,还存在TLS的四次握手

  6. 发送数据:浏览器会向服务器发送HTTP请求

  7. 服务器响应数据:服务器收到请求后,会根据请求的内容做处理后响应数据

  8. 浏览器结束后,主动发送FIN报文,随后进入四次挥手。

    • 浏览器主动发送FIN报文,表示要断开连接
    • 服务器收到后,先返回ACK,表示收到浏览器的断开请求
    • 服务器继续发送剩余的数据,发送完毕后,服务器也发送一个FIN报文,表示服务器这里也发完了,也断开连接
    • 浏览器收到服务器的断开请求后,发送ACK报文,表示已收到,四次挥手结束。

怎么判断两个服务器之间是正常连接的?

TCP保活机制:定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP保活机制就会起作用,每个一段时间就会发送一个探测报文,如果探测报文没有得到响应,认为TCP连接已经死亡,系统内核将错误信息通知给上层应用程序。

服务器ping不通,但是http可以请求成功是为什么?

ping走的是icmp协议,http走的是tcp协议

可能是服务器的防火墙禁止icmp协议,但是没有禁止tcp协议。

网络攻击

DDOS攻击

分布式拒绝服务(DDOS)攻击是通过大规模互联网流量淹没目标服务器,以破坏目标服务器的恶意行为。

SQL注入

如果一个用户输入了一个字符串来查找特定的用户信息,但是应用程序将这个用户的数据直接作为SQL查询的一部分,而不考虑可能的安全问题,那么攻击者可能会利用这一点来执行他们的恶意SQL查询。

CSRF攻击

攻击者诱导用户执行恶意操作,从而获取用户数据或执行恶意代码。通过伪造一个合法的HTTP请求来实现。

XSS攻击

通过在web页面插入恶意脚本代码,诱使用户访问该页面,使得恶意脚本在用户浏览器中执行,从而盗取用户信息。

DNS劫持

攻击者在用户查询DNS服务器时篡改响应,将用户请求的域名映射到攻击者控制的虚假IP地址上,让用户误以为时正常的网站,实际上被重定向到攻击者操控的恶意网站。

相关文章:

【复习】计算机网络

网络模型 OSI 应用层:给应用程序提供统一的接口表示层:把数据转换成兼容另一个系统能识别的格式会话层:负责建立、管理、终止表示层实体之间的通信会话传输层:负责端到端的数据传输网络层:负责数据的路由、转发、分片…...

【R语言】读取CSV数据时,显示[1] PK...<0 行> (或0-长度的row.names)

一、问题 当我使用以下代码读取CSV数据后&#xff0c;发现使用head(data)显示[1] PK...<0 行> (或0-长度的row.names)&#xff0c;如下截图所示。 # 尝试读取文件 data <- read.csv("C:\\Users\\11300\\Desktop\\test.csv", header TRUE) # 检查数据 hea…...

CentOS环境变量配置+解析

环境变量的作用就是让系统快速通过你的命令找到你的可执行程序&#xff0c;windows系统里也同理&#xff0c;也就是你每次输入个命令&#xff0c;系统就会找环境变量里到底有没有叫这个命令进程的 一、环境变量配置 1.编辑配置文件 vim /etc/profile export PATH$PATH:$JAVA…...

最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程

ExoPlayer 是一个开源的 Android 媒体播放库&#xff0c;由 Google 开发和维护&#xff0c;用于替代 Android 系统自带的 MediaPlayer。它提供了更强大的功能、更好的性能和更高的灵活性&#xff0c;适用于各种复杂的媒体播放场景。所以被广泛用于各种播放器场景。 最近项目中…...

【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python

6134. 哞叫时间II Week 1 2月20日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛&#xff0c;但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解&#xff0c;所以农夫约翰将竞赛…...

HTML/CSS中子代选择器

1.作用:选中指定元素中,符合要求的子元素. 子代选择器又称:子元素选择器,子选择器. 2.语法:选择器1>选择器2>选择器3>......选择器n 3.实例 <style>/* div中子代选择器 */div>a{color: red;}</style><div><a href"#">张三</…...

计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

EasyRTC:全平台支持与自研算法驱动的智能音视频通讯解决方案

在智能硬件的浪潮中&#xff0c;设备之间的互联互通已成为提升用户体验的核心需求。无论是智能家居、智能办公&#xff0c;还是工业物联网&#xff0c;高效的音视频通讯和交互能力是实现智能化的关键。然而&#xff0c;传统音视频解决方案往往面临平台兼容性差、交互体验不佳以…...

C#: 日志函数

背景&#xff1a; 1.常见的官方日志模块项目过于复杂&#xff0c;且配置过于繁琐&#xff0c;针对这种现象&#xff0c;实现在大型项目中快速定位错误问题&#xff1b; 实现思路&#xff1a; 1.设置当前日志文件路径&#xff08;获取到当前文件应用程序路径 \ErrorLog) 2.判…...

PyTorch 是如何进行机器学习的

1. 机器学习的核心流程 机器学习的核心是通过数据训练模型&#xff0c;让模型学会从输入数据中提取规律&#xff0c;并对新数据做出预测。整个过程可以分为以下几个步骤&#xff1a; 准备数据&#xff1a;收集并整理数据&#xff0c;分为输入&#xff08;特征&#xff09;和输…...

Java中的Stream API:从入门到实战

引言 在现代Java开发中&#xff0c;Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读&#xff0c;还能通过并行处理提升性能。本文将带你从基础概念入手&#xff0c;逐步深入Stream API的使用&#xff0c;并通过实战案例展示其强大功能。 1. 什么是Stream API…...

【蓝桥杯单片机】客观题

一、第十三届省赛&#xff08;一&#xff09; 二、第十三届省赛&#xff08;二&#xff09;...

Spring Boot 中使用 @Transactional 注解配置事务管理

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务&#xff1b;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污…...

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 &#xff08;1&#xff09;整流&#xff1a;整流是将交流电&#xff08;AC&#xff09;转变为直流电&#xff08;DC&#xff09;。常见的整流电路包括单向整流&#xff08;二极管&#xff09;、桥式整流等。 半波整流&#xff1a;只使用交流电的正…...

《论多源数据集成及应用》审题技巧 - 系统架构设计师

论多源数据集成及应用写作框架 一、考点概述 本论题“论多源数据集成及应用”主要考察的是计算机软件测试工程师在数据管理和集成方面的专业知识与实践能力。论题聚焦于信息爆炸时代企业、组织和个人所面临的数据挑战&#xff0c;特别是如何有效地收集、整理和清洗来自不同渠…...

怎么在Github上readme文件里面怎么插入图片?

环境&#xff1a; Github 问题描述&#xff1a; 怎么在Github上readme文件里面怎么插入图片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案&#xff1a; 1.相对路径引用 上传图片到仓库 将图片文件&#xff08;如 .png/.jpg&#xff…...

【NLP 31、预训练模型的发展过程】

人的行为&#xff0c;究竟是人所带来的思维方式不同还是与机器一样&#xff0c;刻在脑海里的公式呢&#xff1f; 只是因为不同的人公式不同&#xff0c;所以人的行为才不同&#xff0c;可这又真的是人引以为傲的意识吗&#xff1f; 人脑只是相当于一个大型、驳杂的处理器&#…...

【计算机网络】传输层TCP协议

传输层 - layer4 - TCP协议 传输层&#xff1a;位于ISO模型的第四层 ——>L4 tcp协议意为传输控制协议&#xff08;Transmission Control Protocol&#xff09; 提供端到端的连接 端口号范围&#xff1a;0-65535 &#xff08;2^16次方&#xff09; 一个应用程序(服务)会占用…...

vscode settings(二):文件资源管理器编辑功能主题快捷键

参考资料 Visual Studio Code权威指南 by 韩骏 一. 文件资源管理器 1.1 文件资源管理器隐藏文件夹 默认情况下&#xff0c;Visual Studio Code会在文件资源管理器中隐藏一些文件夹&#xff08;如.git文件夹&#xff09;​。可以通过files.exclude来配置要被隐藏的文件和文件…...

halcon机器视觉深度学习对象检测,物体检测

目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本&#xff0c; 然后训练模型&#xff0c;导出模型文件 这个是模型 mod…...

go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值

内容包括 1. 用interface{}接收值 2. 判断interface{}的类型 switch 3. 打印interface{}的类型 4. 通过字符串对结构体&#xff0c;interface{}等进行设置值、获取值处理 示例代码 package mainimport ("fmt""log""reflect" )type Student…...

单臂路由

单臂路由&#xff08;Router on a Stick&#xff09;是一种网络配置方式&#xff0c;主要用于在单个物理接口上实现多个VLAN之间的路由。它通常用于交换机与路由器之间的连接&#xff0c;适用于VLAN间通信需求较小的情况。 工作原理 VLAN划分&#xff1a;交换机上配置多个VLAN…...

SpringBoot【实用篇】- 测试

文章目录 目标&#xff1a; 1.加载测试专用属性3.Web环境模拟测试2.加载测试专用配置4.数据层测试回滚5.测试用例数据设定 目标&#xff1a; 加载测试专用属性加载测试专用配置Web环境模拟测试数据层测试回滚测试用例数据设定 1.加载测试专用属性 我们在前面讲配置高级的…...

NutUI内网离线部署

文章目录 官网拉取源代码到本地仓库修改源代码打包构建nginx反向代理部署访问内网离线地址 在网上找了一圈没有写NutUI内网离线部署的文档&#xff0c;花了1天时间研究下&#xff0c;终于解决了。 对于有在内网离线使用的小伙伴就可以参考使用了 如果还是不会联系UP主:QQ:10927…...

【深度学习】Adam和AdamW优化器有什么区别,以及为什么Adam会被自适应学习率影响

Adam 和 AdamW 的主要区别在于 权重衰减&#xff08;Weight Decay&#xff09; 的实现方式&#xff0c;具体如下&#xff1a; 1. 权重衰减&#xff08;Weight Decay&#xff09;处理方式 Adam&#xff1a;采用 L2 正则化&#xff0c;通过在梯度更新时手动添加 weight_decay 项…...

Pytorch的F.cross_entropy交叉熵函数

参考笔记&#xff1a;pytorch的F.cross_entropy交叉熵函数和标签平滑函数_怎么给crossentropyloss添加标签平滑-CSDN博客 先来讲下基本的交叉熵cross_entropy&#xff0c;官网如下&#xff1a;torch.nn.functional.cross_entropy — PyTorch 1.12 documentation torch.nn.fun…...

一文讲解Redis为什么读写性能高以及I/O复用相关知识点

Redis为什么读写性能高呢&#xff1f; Redis 的速度⾮常快&#xff0c;单机的 Redis 就可以⽀撑每秒十几万的并发&#xff0c;性能是 MySQL 的⼏⼗倍。原因主要有⼏点&#xff1a; ①、基于内存的数据存储&#xff0c;Redis 将数据存储在内存当中&#xff0c;使得数据的读写操…...

[特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南

&#x1f680; Elasticsearch 双剑合璧&#xff1a;HTTP API 与 Java API 实战整合指南 一、HTTP API 定义与用途 Elasticsearch 的 HTTP API 是基于 RESTful 接口设计的核心交互方式&#xff0c;支持通过 URL 和 JSON 数据直接操作索引、文档、集群等资源。适用于快速调试、…...

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…...

蓝桥杯之阶段考核

&#x1f4d6; Day 7&#xff1a;阶段考核 - 蓝桥杯官方模拟赛&#xff08;限时 4 小时&#xff09; &#x1f4d6; 一、如何高效完成模拟赛&#xff1f; 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛&#xff0c;需要掌握以下策略&#xff1a; 1. 赛前准备 ✅ 环…...

DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…...

华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)

文章目录 1. **查看固件和驱动版本**2. **查看CANN版本**3. **其他辅助方法**注意事项 在华为昇腾服务器上查看固件、驱动和CANN版本的常用方法如下&#xff1a; 1. 查看固件和驱动版本 通过命令行工具 npu-smi 执行以下命令查看当前设备的固件&#xff08;Firmware&#xff0…...

红帽7基于kickstart搭建PXE环境

Kickstart 文件是一种配置文件&#xff0c;用于定义 Linux 系统安装过程中的各种参数&#xff0c;如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面&#xff0c;方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…...

【Python爬虫(58)】从0到1:Scrapy实战爬取大型新闻网站

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

DeepSeek使用从入门到精通

1. DeepSeek概述 - DeepSeek是国产大模型&#xff0c;提供网页版和App版。因其强大功能&#xff0c;遭受网络攻击&#xff0c;但国内用户可直接使用。 2. 入门技巧 - 忘掉复杂提示词&#xff1a;用简洁明了的需求指令&#xff0c;AI能自我思考并生成优质内容 - 明确需求&#…...

【分布式数据一致性算法】Gossip协议详解

在分布式系统中&#xff0c;多个节点同时提供服务时&#xff0c;数据一致性是核心挑战。在多个节点中&#xff0c;若其中一个节点的数据发生了修改&#xff0c;其他节点的数据都要进行同步。 一种比较简单粗暴的方法就是 集中式发散消息&#xff0c;简单来说就是一个主节点同时…...

一、初始爬虫

1.爬虫的相关概念 1.1 什么是爬虫 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟浏览器发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;自动地爬取互联网信息的程序。 原则上&#xff0c;只要是浏览器…...

C语言番外篇(3)------------>break、continue

看到我的封面图的时候&#xff0c;部分读者可能认为这和编程有什么关系呢&#xff1f; 实际上这个三个人指的是本篇文章有三个部分组成。 在之前的博客中我们提及到了while循环和for循环&#xff0c;在这里面我们学习了它们的基本语法。今天我们要提及的是关于while循环和for…...

ipad连接电脑断断续续,不断弹窗的解决办法

因为ipad air 屏幕摔坏&#xff0c;换了一个内外屏&#xff0c;想用爱思检验一下屏幕真伪&#xff0c; 连接电脑时&#xff0c;断断续续&#xff0c;连上几秒钟然后就断开&#xff0c;然后又连上 然后又断开&#xff0c;不断地弹出信任的弹窗。 刚开始以为是数据线问题&#x…...

dockerfile构建haproxy

1. 结构目录 [rootlocalhost ~]# tree haproxy/ haproxy/ ├── dockerfile └── files├── haproxy-2.5.0.tar.gz├── haproxy.cfg├── install.sh└── start.sh1 directory, 5 files [rootlocalhost ~]# [rootlocalhost ~]# cd haproxy/ [rootlocalhost haproxy]…...

创建第一个 Maven 项目(一)

一、引言 在 Java 开发的广袤天地中&#xff0c;Maven 宛如一位全能的管家&#xff0c;发挥着举足轻重的作用。它是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和构建自动化工具&#xff0c;极大地简化了 Java 项目的开发流程。 Maven 的核心优势之一在于其强…...

深度学习pytorch之19种优化算法(optimizer)解析

提示&#xff1a;有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法&#xff0c;包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等&#xff0c;通过对这些算法的公式和参数说明进行详细解析…...

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…...

SSH无密登录配置

SSH无密登录配置 1、在用户目录下创建.ssh目录 mkdir /home/atguigu/.ssh2、在.ssh目录下生成ssh秘钥&#xff08;需要切换到Hadoop集群使用的用户&#xff0c;再运行命令&#xff09; ssh-keygen -t rsa然后敲&#xff08;三个回车&#xff09;&#xff0c;就会生成两个文件…...

Rust并发编程实践:10分钟入门系统级编程

目录 学前一问&#xff1a;Rust为何而出现&#xff1f; 摘要 引言 正文解析&#xff1a; 一、Rust中的并发编程基础 1.1 线程 1.2 协程 二、Rust并发编程的高级特性 2.1 通道 2.2 原子操作 2.3 锁 三、实例展示&#xff1a;优化并发编程性能 1. 并行计算 2. 异步…...

Linux 命令大全完整版(06)

2. 系统设置命令 pwunconv 功能说明&#xff1a;关闭用户的投影密码。语法&#xff1a;pwunconv补充说明&#xff1a;执行 pwunconv 指令可以关闭用户投影密码&#xff0c;它会把密码从 shadow 文件内&#xff0c;重回存到 passwd 文件里。 rdate(receive date) 功能说明&a…...

VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更【使用deepseek生成的一篇文章】

在 VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更&#xff0c;可通过以下步骤实现&#xff1a; 确认是否为纯时间戳修改 首先确认文件的修改是否仅涉及时间戳&#xff0c;使用终端运行&#xff1a; git diff -- <file>若输出为空但 Git 仍提示修改&#xff0c;可…...

echarts找不到了?echarts社区最新地址

前言&#xff1a;在之前使用echarts的时候&#xff0c;还可以通过上边的导航栏找到echarts社区&#xff0c;但是如今的echarts变更之后&#xff0c;就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…...

Git-速查

Git 安装 Git 之后&#xff0c;你可以… 配置全局用户信息&#xff08;推荐&#xff09; 全局设置&#xff0c;创建本地仓库时默认分支名称为 main&#xff08;你需要什么名称就该什么名称&#xff09;【推荐配置为 main 】 git config --global init.defaultBranch main全…...

AxiosError: Network Error

不知怎么的&#xff0c;项目还在开发阶段&#xff0c;之前还好好的&#xff0c;玩儿了两天再一打开发现页面无法显示数据了&#xff0c;报错如下&#xff1a; 我以为是后端出问题了&#xff0c;但是后端控制台无报错&#xff0c;又用postman测试了一下&#xff0c;可以获取到数…...