输入URL到界面展示的过程
状态码
HTTP和HTTPS
TCP和UDP
TCP握手和挥手
TCP可靠性传输
基础
ip地址
192.168.1.168(ip地址)=192.168.1.0(网络地址)+0.0.0.168(主机地址);
只有网络地址相同的才可以进行通信
子网掩码

他可以通过和ip地址按位与来区分网络地址和主机地址
网关
作用:让不同网络地址的ip进行通信
网关地址:就是网关设备自己的地址
网卡和ip
一张网卡可以有多个 IP 地址
IP 必须依附在某个网卡上才能通信
应用层
应用层协议:http,https,DNS等
HTTP报文分请求报文和响应报文
这里看

请求报文(!)
请求行
请求方法,请求目标(URL),HTTP协议版本(一般隐藏了)
请求头部:
包含客户端的信息,和请求体相关信息,比如说类型,长度等
请求体(payload):
通常用于POST请求等需要传输数据的情况
响应报文(!)
响应行
HTTP/1.1 200 OK:
HTTP/1.1表示http协议的版本
200 是响应状态码
ok 是对响应状态码的描述
响应头
包含服务端信息和响应体的信息
响应体
返回的数据
状态码(!)
2xx 成功
200 OK:请求成功
201 Created:资源已创建成功(常见于 POST)
204 No Content:请求成功但无返回内容
3xx 重定向
301 Moved Permanently:永久重定向
302 Found:临时重定向
4xx 客户端错误
400 Bad Request:请求报文语法有误
401 Unauthorized:未认证(需登录或令牌)
403 Forbidden:服务器拒绝访问,没有权限进行访问
404 Not Found:请求的资源不存在
405 Method Not Allowed:方法不被允许
5xx 服务器错误
500 Internal Server Error:服务器内部错误,比如说处理请求发生异常啊,数据库查询失败啊,配置错误都可能导致
502 Bad Gateway:网关错误(如 Nginx 代理后端出错)
503 Service Unavailable:服务不可用(可能超载或维护)
504 Gateway Timeout:网关超时,可能的原因有服务器响应过慢,超过了 Gatway 配置的 Timeout,如查库操作耗时三分钟,超过了 Nginx 配置的超时时间
重定向
SC_MOVED_PERMANENTLY = 301sendRedirect()默认是 302
浏览器会 缓存这个重定向,下一次访问 /old-page,浏览器会直接请求 /new-page,旧 URL 不再请求服务器(
业务逻辑决定301还是302
@GetMapping("/old-page")
public void permanentRedirect(HttpServletResponse response) throws IOException {
boolean isPermanent = checkIfPermanent(); // 自定义业务逻辑
if (isPermanent) {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301
response.setHeader("Location", "/new-page");
} else {
// 临时跳转 302
response.sendRedirect("/temporary-page");
}
}
private boolean checkIfPermanent() {
// 可以根据数据库、配置、时间等逻辑判断是否永久迁移
return true;
}
为什么没有返回值?
因为你直接在
response上写了 HTTP 响应(状态码 + Header)浏览器收到后,会根据状态码和
Location自动发起新请求方法不需要返回值,因为响应已经被发送到客户端
客户端行为
浏览器检测到 301/302 → 自动请求
Location指定的 URL
get和post的区别
主要用途不同,get主要是请求资源,post主要是添加或修改
数据传输方式不同,get方法数据是添加在URL后面,而post数据是在请求体中
数据大小的限制,get请求的数据通常很小,而post请求的数据通常没有固定限制
由于数据大小的限制,在一些多条件查询的场景下,我们会使用post进行查询
put是更新操作,delete是删除操作
这里还有@Pathvarible等注解的结合啊啊啊啊
HTTP和HTTPS的区别(!)
HTTP的超文本传输协议,信息是明文传输,存在安全风险。HTTPS则解决HTTP不安全的确定,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
两者的默认端口不一样,HTTP默认端口是80,HTTPS默认端口号是443
HTTP建立相对简单,只需TCP3次握手之后便可进行HTTP的报文传输,而HTTPS在3次握手之后还要进行STLS的握手过程,在可进行加密报文传输。
TLS( Transport Layer Security)(!)
在 SSL (Secure Sockets Layer) 的基础上发展而来
具体的流程是在浏览器请求服务器后,服务器会返回CA证书,这里面包含了服务器信息,是否又CA签发,以及最重要的公钥。
之后浏览器生产一个临时密钥,并且用公钥加密。待服务端接受后,再用私钥解密,这样即使被窃取,因为没有私钥,也无法获取数据
传输层
三次握手(TCP建立连接的过程)
当浏览器输入网址和DNS解析之后,我们就确定了服务器的ip和端口
这时浏览器发送一个SYN报文给服务器,SYN包含起始序号x,SYN-SENT状态
服务器在收到请求后返回SYN-ACK,SYN-ACK包含起始序号y,同时进入SYN-RECEIVED状态
浏览器收到之后再发送ACK报文,并且进入ESTABLISHRED状态5
服务器收到ACK,进入ESTABLISHED状态
这时连接建立成功,双方可以进行通信了
为什么要三次握手
避免伪连接。例如假设有一个旧的SYN滞留了很久突然到达服务器。如果只有两次握手的话,服务器收到这个旧SYN就会直接返回SYN-ACK并且进入ESTABLISHED,但是客户端不需要这个连接,自然也不会返回ACK,这样导致服务器白白分配资源。但是如果有3次握手,服务器还有一个SYN-RECEIVED状态,这样如果是历史连接可以接受到客户端的RST来断开连接
其他的还有序列号的同步和避免资源浪费等
序号的作用
TCP 传输数据时,数据会被拆成很多小包发送。序号就是给每个字节(或者每个数据包)编号,主要有两个目的:
保证顺序
网络上数据包可能乱序到达,比如第二个包比第一个先到。
序号让接收方知道哪个包先到,按正确顺序组装数据。
检测丢包和重传
如果接收方发现某个序号的数据包没收到,就会请求发送方重发。
这样 TCP 能保证数据完整,不丢失。
四次挥手
浏览器发送FIN(finish)报文,表示没有数据发送了,进入FINSIH_WAIT_1状态
服务端收到FIN后,向浏览器发送ACK,表示收到,进入CLOSE_WAIT状态
服务端准备好断开后,向客户端发送FIN,进入LAST_ACK状态
客户端收到FIN后,向服务端发送ACK,确认断开请求,进入TIME_WAIT状态,经过2MSL时间后,进入CLOSE状态
服务器收到ACK,也进入CLOSE状态
为什么要4次挥手
因为 TCP 是 全双工,所以关闭是 每个方向都需要单独确认,这就导致了四次挥手。
这个没什么要说的吧,总不可能问为什么不可以3次挥手吧
为什么4次挥手后要等2MSL
MSL是TCP报文在网络中的最大生存时间
确保延迟报文全部消失。如果网络中存在延迟报文,不等待的话,客户端可能建立新连接,就报文可能认为是新数据。等待2MSL可以确保旧报文全部消失
确保服务端收到最后的ACK,如果服务端没收到,会重发FIN,客户端在TIEM_WAIT阶段仍然可以重发ACK,确保服务器正常关闭
TCP为什么可靠
连接管理:通过3次握手确定连接,4次挥手终止连接,避免数据残留和浪费
数据分块和序号标识:发送端将数据分割为合适大小的报文段,没段分配唯一序号,接收端可以通过序号重组到达的段,既能避免数据重复,丢失,还可以保证有序性
确认应答:接收方再收到数据后,会回传ACK报文,报文中带有此次确认的序列号,来告知发送方接受到数据,如果指定时间发送方未接受到确认应答,会启动超时重传
超时重传:(数据包丢失)再指定时间发送端未收到确认应答,那么就会起始超时重传。(确认包丢失),当接收端收到重复数据时直接丢弃,并且重新回传ACK报文
流量控制:TCP 接收端有一个 缓冲区 用来存储收到的数据。而每次接收端返回ACK报文时会带上缓冲区还有多少空间,避免数据溢出
TCP和UDP的区别
特点决定场景
连接方式不同:TCP需要3次握手才建立连接,UDP无连接,直接发送
可靠性:TCP可靠传输,保证数据完整性,顺序,不重复。UDP不保证可靠性
使用的场景不同:TCP适用于高可靠,顺序性,完整性情况,如网页流量,文件传输等。而UDP适用于实时性要求较高,可以容忍丢包的场景,如视频会议等
DNS解析
在拿到一个域名后,浏览器先检测自身缓存,查询是否解析过该域名,如果没有则继续查询操作系统的DNS解析缓存
如果还没有,就去本地DNS服务器查询(wife,流量提供商,公司或学校都可以是)
如果还没有,本地DNS服务器会向根域名服务器发起查询请求得到对应的顶级域名服务器的地址
在在顶级域名服务器发起查询后返回对应IP再返回给客户端并且写入缓存便于下一次查询
根域名服务器的定义
根 DNS(Root DNS) 是整个 域名系统的最顶层服务器。
它不存储每个域名的 IP,只负责告诉你 下一步该去哪个顶级域名服务器(TLD DNS)查。
作用:指路,让 DNS 查询能够从根开始,逐层找到目标域名的权威 DNS。
本地 DNS 服务器问根服务器:
example.com 的 IP 是多少?根服务器不会直接给 IP,而是告诉本地 DNS:
“你要找
.com域名,去这个 TLD 服务器问吧。”本地 DNS 再去
.com的顶级域名服务器查询,逐级找到权威 DNS
综合性
从输入 URL 到页面展示到底发生了什么?
浏览器解析URL,将其分解为协议,域名,路径等部分
对域名进行DNS解析,获得服务器的IP
之后进行TCP连接
连接成功之后发送HTTP请求
服务端进行逻辑处理
之后服务端发送HTTP响应
最后关闭连接