互联网日常生活中最为常见的行为便是在浏览器输入一个网址, 然后浏览网页内容, 这样一个简单的行为背后有哪些技术细节呢, 本文将做一些介绍.
全流程可拆分为4个主要步骤
IP地址类似于互联网世界中的门牌号, 公网IP地址全球唯一, 其作为互联网设备的标识符, 用来实现不同设备之间的通信.
IPv4和IPv6的区别
互联网中的任何一个设备都可以通过一个公网IP访问, IP地址是数字, 记忆起来很麻烦, 所以就用域名来记忆. 域名的格式类似于hi.test.com
, 其从右往左阅读, 最右侧为顶级域名(如.com, .org, .net), 顶级域名由ICANN维护; 次右为二级域名, 表示其他信息, 这些信息还可以继续向左叠加.
DNS解析过程中使用UDP协议
浏览器DNS缓存
chrome://net-internals/#dns
edge://net-internals/#dns
操作系统DNS缓存
C:\Windows\System32\drivers\etc\hosts
/etc/hosts
DNS服务器
操作系统中的DNS配置
控制面板->网络与共享中心->更改适配器设置->属性->Internet协议版本4(TCP/IPv4)->DNS服务器地址
/etc/resolv.conf
递归查询和迭代查询
客户端和本地DNS服务器之间是递归, 本地DNS服务器和其他DNS服务器之间是迭代.
用日常生活场景来比喻三次握手 (three-way handshake)
[SYN] Seq=0
[SYN, ACK] Seq=0 Ack=1
[ACK] Seq=1 Ack=1
为什么需要三次握手?
简单来说是为了避免网络拥塞
导致的异常情况: 客户端发送连接请求, 该请求在某个节点长时间滞留, 已经失效, 但在服务端接收到后会误认为是新的连接请求, 服务端发出确认后连接就建立了, 但客户端此时并没有发出建立连接的请求, 所以就造成了服务端资源的浪费.
改为两次握手
有可能发生死锁
.
传输层
协议 (传输层是什么可以参考TCP/IP协议栈)面向连接
的, 必须先建立连接, 再传输数据, 最后释放连接可靠交付
的服务, 数据传输无差错, 不丢失, 无重复, 且按序到达全双工
通信, 通信双方可以同时收发数据字节流
, 其将应用层的数据视为无结构的字节流, 并不知道含义TCP的标志位用来确定TCP的目的, 常见的标志位包括
SYN
: 同步, 用于建立连接和同步序列号ACK
: 确认, 对已接受的数据包确认FIN
: 完成, 表示数据已发送完毕, 即将关闭连接PSH
: 推送, 表示该数据包被接收后应立即交给上层应用, 不在缓存区排队RST
: 重置, 用于连接复位, 拒绝错误和非法的数据包URG
: 紧急, 表示数据包应被加急处理此外还有2个序号:
seq
: 顺序号, 数据包中第一个字节的序号ack
: 确认号, 响应前面的seq
, 值为seq+1
, 可以理解为预期下次发送的序列号TCP
的KeepAlive目的在于保持连接, 检测连接状态HTTP
协议的Keep-Alive目的是连接复用发送和接受数据使用http
协议进行.
应用层
通信协议无状态
协议, 其不会对历史请求和通信状态持久化存储, 目的是为了保持简单高效HTTP的发挥的作用如下图:
基本结构包括三部分: 请求行, 消息头, 正文
常见请求方法:
GET
: 获取资源 (最常用方法)HEAD
: 获取资源的元信息, 只传回响应头, 轻量版的GET
POST
: 写入或上传数据, 通常表示新建 (第二常用方法)PUT
: 类似POST
, 含义有细微区别, 通常表示更新, 但用的比较少DELETE
: 删除资源, 比较危险的操作TRACE
: 追踪请求响应的传输路径, 多用于链路的测试和诊断CONNECT
: 和另一个服务器建立特殊的连接隧道, Web服务器作为中间代理OPTIONS
: 列举可对资源实行的方法基本结构包括三部分: 状态行, 消息头, 正文
状态码分类
1xx
: 指示信息, 表示请求已接收, 继续处理2xx
: 成功, 表示请求已被成功接收, 理解, 接受3xx
: 重定向, 要完成请求必须进行更进一步的操作4xx
: 客户端错误, 请求有语法错误或请求无法实现5xx
: 服务器端错误, 服务器未能实现合法的请求常见状态代码
200
: OK, 客户端请求成功400
: Bad Request, 客户端请求语法错误, 无法被服务器理解404
: Not Found, 请求的资源不存在500
: Internal Server Error, 服务器发生内部错误503
: Server Unavailable, 服务器当前无法处理客户端请求, 一段时间后可能恢复正常HTTP协议存在一些缺点
为了解决上述缺点, 就有了HTTPS, 其可以简单理解为
HTTPS=HTTP+加密+认证+完整性保护
在协议栈上HTTPS多了SSL (Secure Socket Layer) 或TLS (Transport Layer Security)
用日常生活场景来比喻四次挥手
具体的交互细节
使用Wireshark抓包
为什么建立连接是三次握手, 而关闭时需要四次挥手?
建立连接时: 服务端接收到客户端的SYN后, 直接发送 SYN+ACK 同时完成应答(ACK)和同步(SYN), 因此只需要三次.
TCP是全双工
的通信协议, 客户端发送FIN表示自己的数据发送完毕, 但此时服务端依然可以发送数据到客户端, 需要等待服务端发送完毕数据后再发送FIN表示服务端也完毕.
【总结】访问一个网页的全过程_网页访问全过程_toumingren527的博客-CSDN博客
访问一个网页的全过程(超详细版)_web访问的过程_小包同学666的博客-CSDN博客
一个域名可以对应多个IP吗?如何通过DNS实现? - 知乎 (zhihu.com)
DNS域名详细解析过程(最全面,看这一篇就够)_dns解析_bangshao1989的博客-CSDN博客
浏览器输入网址,到显示网页全过程 - 知乎 (zhihu.com)
访问一个网页的全过程(超详细版)_web访问的过程_小包同学666的博客-CSDN博客
使用 WireShark 分析 TCP/IP 三次握手 和 四次挥手 - bylijian - 博客园 (cnblogs.com)
http、https、tcp三次握手,四次挥手学习笔记 - 知乎 (zhihu.com)
聊聊 TCP 中的 KeepAlive 机制 - 知乎 (zhihu.com)
一次完整的HTTP请求过程是怎么样的呢?【图文详解】 - 知乎 (zhihu.com)
一文彻底搞懂 TCP三次握手、四次挥手过程及原理 - 知乎 (zhihu.com)
http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm
TCP/IP协议栈详解_mayifan_blog的博客-CSDN博客
深入理解HTTP协议 - 知乎 (zhihu.com)
https://www.geeksforgeeks.org/state-the-core-components-of-an-http-response/
https://zhuanlan.zhihu.com/p/359141330
有些地方写的有问题或者不够明确, 欢迎看到这里的朋友们纠正和补充
内容比较多, 后续还会继续更新完善