http请求报文,响应报文
301 Moved Permanently
和 404 Not Found
301,服务器会返回新的 URL,客户端应该用新的 URL 进行访问。
502 错误意味着代理服务器和上游服务器无法通信,比如上游服务器故障
504 Gateway Time-out 上游服务器响应超时
HTTP 的 Keep-Alive 参数--->长连接
⚠️数据在经过 TCP 传输时,由于网络层或者传输层的限制,被分成多个小包发送到接收端(拆包),两个较小的数据包也可能放在一起发送,服务器先收到一个消息头,里面包含了
Content-Length , 后续会收到多个数据包,数据包有自己在数据流的序列号,服务器按照序列号重新组装数据,通过content-length
可以知道某个消息是否全部收完
粘包拆包解决方式:
1. 结束符
2. 应用层自定义协议
例如消息头的 content-length 字段,明确数据的长度,这样知道何时收到了完整的数据。
举个例子:
0005Hello0007World!!0013This is Netty
一个进程可以通过监听(bind)某个端口来接收来自客户端的网络请求
http为什么不安全?明文传输
websocket 比较 http 长连接, 服务器向客户端推送消息
HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议, 防止篡改,加密传输,身份验证
https比较http? https 加入SSL/TLS协议进行加密,端口不同(443),有数字证书身份验证
https握手? client和server三次握手通信,向对方发送一个自己生成的随机数(Client Random、Server Random、pre-master key),
而且约定加密算法。
第四次握手,双方都用加密算法生成本次通信的「会话秘钥, 以后通信都会使用它
https防范中间人攻击?中间人攻击的关键在于攻击者冒充服务器与客户端建立连接 ,https四次握手保证安全(比如数字证书
HTTP是应用层协议,定义了客户端和服务器之间交换的数据格式和规则;HTTP是应用层协议,定义了客户端和服务器之间交换的数据格式和规则;
DNS解析过程?
client与本地dns服务器递归; 递归解析器接收到权威 DNS 服务器的响应后,会将 IP 地址返回给用户的操作系统
每个请求都是相互独立的,因此讲http是无状态的
server集群情况下,JWT令牌为什么可以解决登录状态共享问题?
server不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器, 比如JWT就是这样
JWT保证不同服务器都使用同一个公钥/私钥签名机制
TCP头部的内容和作用
序列号,确认应答号,控制位(ack,syn,fin)
三次握手:
过程: client: client_isn =x ; server: server_isn=y, ack_number=x+1; client: ack_number=y+1
⚠️为什么要三次?
1. 防止旧的连接初始化引发混乱:
比如如果2次握手,服务端收到syn序号后就进入establish状态,客户端收到ack发现是旧连接的ack,就发送RST,
在它到达之前,服务器都可以发送数据
2.同步双方初始序列号
第三次发送的确认包丢失了发生什么? server触发超时重传,有次数限制
三次握手结束,连接会被保存到内核的全连接队列, 调用 accpet 就是从把连接取出来给用户程序使用。
accept
在三次握手中的角色 : accept
从监听队列中取出已经完成连接的客户端,并为此客户端创建一个新的套接字来表示该连接
第一个 SYN 报文,服务器没有收到怎么办? 客户端超时重传syn
第二次握手SYN + ACK 报文丢了怎么办? 客户端(SYN) 和服务端(SYN+ACK)都会重传,超过一定次数断开连接
第一次握手,客户端发送SYN报后,服务端回复ACK报,那这个过程中服务端内部做了哪些工作
内核把连接加入半连接队列
大量SYN包发送给服务端服务端会发生什么事情?
半连接队列满了,拒绝新连接请求
防御手段:1. 限制 SYN-ACK重试次数 2.限制半连接队列的大小
四次挥手
过程如下
client send FIN ,缓冲区中被写入EOF, 服务端read()会返回0,
server send ACK 服务端收到fin就马上返回一个ack,但仍然可以发送数据
server send FIN 发送完成后,发出 fin 报文
client send ack
等待2 MSL , client关闭连接
为什么4次握手中间两次不能变成一次?
服务端应用程序可能还有数据要发送,等待没有数据要发送,应用程序调用了关闭连接的函数,内核发送FIN报文
第一次挥手fin包丢失,发生什么?
客户端重传,(有重发次数
第三次挥手一直没发,会发生什么
客户端进入 FIN_WAIT_2
状态并等待,然后超时退出状态
客户端最后等待TIME_WAIT 目的?
客户端第四次挥手发送ack操作的兜底,服务端如果没有收到这个 ACK,会重发 FIN 包,
所以等待一段时间,防止收不到重发 FIN 包
出现大量TIME_WAIT 原因?
1. 没有使用http长连接
2.长连接超时( tcp_keepalive_time)
3.长连接请求数量达到上限
⚠️ tcp 可靠传输 体现
三次握手,四次挥手; 序列号,确认应答号,超时重传
流量控制,拥塞控制
网页加载慢,怎么排查?
dns解析,http状态码,tcp连接,网络接口层
2个网络攻击:
xss攻击:诱导用户执行恶意的脚本,比如访问了一个链接
csrf: 诱导 持有某些数据(比如登录状态)的用户 ,执行错误的服务器请求
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步