NetWork——描述一次完整的网络请求过程

更新时间:2023-06-06 10:56:52 阅读: 评论:0

NetWork——描述⼀次完整的⽹络请求过程
affectation>phelps当我们在浏览器的地址栏输⼊ ,然后回车,回车这⼀瞬间到看到页⾯到底发⽣了什么呢?
以下过程仅是个⼈理解:
域名解析 --> 发起TCP的3次握⼿ --> 建⽴TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到
html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图⽚等) --> 浏览器对页⾯进⾏渲染呈现给⽤户
关于HTTP协议可以参考以下:
以下就是上⾯过程的⼀⼀分析,我们就以Chrome浏览器为例:progress是什么意思
1.域名解析
⾸先Chrome浏览器会解析 这个域名(准确的叫法应该是主机名)对应的IP地址。怎么解析到对应的IP地址?
① Chrome浏览器 会⾸先搜索浏览器⾃⾝的DNS缓存(缓存时间⽐较短,⼤概只有1分钟,且只能容纳1000条缓存),看⾃⾝的缓存中是否有 对应的条⽬,⽽且没有过期,如果有且没有过期则解析到此结束。
注:我们怎么查看Chrome⾃⾝的缓存?可以使⽤ chrome://net-internals/#dns 来进⾏查看
② 如果浏览器⾃⾝的缓存⾥⾯没有找到对应的条⽬,那么Chrome会搜索操作系统⾃⾝的DNS缓存,如果找到且没有过期则停⽌搜索解析到此结束.
注:怎么查看操作系统⾃⾝的DNS缓存,以Windows系统为例,可以在命令⾏下使⽤ ipconfig /displaydns 来进⾏查看
③ 如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts⽂件(位于C:\Windows\System32\drivers\etc),看看这⾥⾯有没有该域名对应的IP地址,如果有则解析成功。
高中英语语法总结④ 如果在hosts⽂件中也没有找到对应的条⽬,浏览器就会发起⼀个DNS的系统调⽤,就会向本地配置的⾸选DNS服务器(⼀般是电信运营商提供的,也可以使⽤像Google提供的DNS服务器)发起域名解析请求(通过的是UDP协议向DNS的53端⼝发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址),运营商的DNS服务器⾸先查找⾃⾝的缓存,找到对应的条⽬,且没有过期,则解析成功。如果没有找到对应的条⽬,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求,它⾸先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),找打根域的DNS地址,就会向其发起请求(请问
这个域名的IP地址是多少啊?),根域发现这是⼀个顶级域com域的⼀个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去,于是运营商的DNS就得到了com域的IP地址,⼜向com域的IP地址发起了请求(请问这个域名的IP地址是多少?),com域这台服务器告诉运营商的DNS我不知道这个域名
的IP地址,但是我知道这个域的DNS地址,你去找它去,于是运营商的DNS⼜向这个域名的DNS地址(这个⼀般就是由域名注册商提供的,像万⽹,新⽹等)发起请求(请问这个域名的IP地址是多少?),这个时候
<域的DNS服务器⼀查,诶,果真在我这⾥,于是就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了这个域名对应的IP地址,并返回给Windows系统内核,内核⼜把结果返回给浏览器,终于浏览器拿到了  对应的IP地址,该进⾏⼀步的动作了。
注:⼀般情况下是不会进⾏以下步骤的
如果经过以上的4个步骤,还没有解析成功,那么会进⾏如下步骤(以下是针对Windows操作系统):
⑤ 操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近⼀段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存⾥⾯。什么情况下该步能解析成功呢?就是该名称正好是⼏分钟前和我成功通信过,那么这⼀步就可以成功解析。
⑥ 如果第⑤步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)
⑦ 如果第⑥步也没有查询成功,那么客户端就要进⾏⼴播查找
⑧ 如果第⑦步也没有成功,那么客户端就读取LMHOSTS⽂件(和HOSTS⽂件同⼀个⽬录下,写法也⼀样)
如果第⼋步还没有解析成功,那么就宣告这次解析失败,那就⽆法跟⽬标计算机进⾏通信。只要这⼋步中有⼀步可以解析成功,那就可以成功和⽬标计算机进⾏通信。
看下图抓包截图:
Linux虚拟机测试,使⽤命令 wget 来请求,发现直接使⽤chrome浏览器请求时,⼲扰请求⽐较多,所以就使⽤wget 命令来请求,不过使⽤wget命令只能把index.html请求回来,并不会对index.html中包含的静态资源(js、css等⽂件)进⾏请求。
抓包分析:
① 号包,这个是那台虚拟机在⼴播,要获取192.168.100.254(也就是⽹关)的MAC地址,因为局域
⽹的通信靠的是MAC地址,它为什么需要跟⽹关进⾏通信是因为我们的DNS服务器IP是外围IP,要出去必须要依靠⽹关帮我们出去才⾏。
② 号包,这个是⽹关收到了虚拟机的⼴播之后,回应给虚拟机的回应,告诉虚拟机⾃⼰的MAC地址,于是客户端找到了路由出⼝。
③ 号包,这个包是wget命令向系统配置的DNS服务器提出域名解析请求(准确的说应该是wget发起了⼀个DNS解析的系统调⽤),请求的域名,期望得到的是IP6的地址(AAAA代表的是IPv6地址)
④ 号包,这个DNS服务器给系统的响应,很显然⽬前使⽤IPv6的还是极少数,所以得不到AAAA记录的
⑤ 号包,这个还是请求解析IPv6地址,但是这个主机名是不存在的,所以得到结果就是no such name
⑥ 号包,这个才是请求的域名对应的IPv4地址(A记录)
⑦ 号包,DNS服务器不管是从缓存⾥⾯,还是进⾏迭代查询最终得到了域名的IP地址,响应给了系统,系统再给了wget命令,wget于是得到了的IP地址,这⾥也可以看出客户端和本
地的DNS服务器是递归的查询(也就是服务器必须给客户端⼀个结果)这就可以开始下⼀步了,进⾏TCP的三次握⼿。
一般过去时的用法2.发起TCP的3次握⼿
拿到域名对应的IP地址之后,Ur-Agent(⼀般是指浏览器)会以⼀个随机端⼝(1024 < 端⼝ < 65535)向服务器的WEB程序(常⽤的有httpd,nginx等)80端⼝发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域⽹内除外),进⼊到⽹卡,然后是进⼊到内核的TCP/IP协议栈(⽤于识别该连接请求,解封包,⼀层⼀层的剥开),还有可能要经过Netfilter防⽕墙(属于内核的模块)的过滤,最终到达WEB程序(本⽂就以Nginx为例),最终建⽴了TCP/IP的连接。
如下图:
1) Client⾸先发送⼀个连接试探,ACK=0 表⽰确认号⽆效,SYN = 1 表⽰这是⼀个连接请求或连接接受报⽂,同时表⽰这个数据报不能携带数据,q = x 表⽰Client⾃⼰的初始序号(q = 0 就代表这是第0号包),这时候Client进⼊syn_nt状态,表⽰客户端等待服务器的回复
2) Server监听到连接请求报⽂后,如同意建⽴连接,则向Client发送确认。TCP报⽂⾸部中的SYN 和 ACK都置1 ,ack = x + 1表⽰期望收到对⽅下⼀个报⽂段的第⼀个数据字节序号是x+1,同时表明x
为⽌的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),q = y 表⽰Server ⾃⼰的初始序号(q=0就代表这是服务器这边发出的第0号包)。这时服务器进⼊syn_rcvd,表⽰服务器已经收到Client的连接请求,等待client的确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表⽰确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client⾃⼰的序号q= x + 1(表⽰这就是我的第1个包,相对于第0个包来说的),⼀旦收到Client的确认之后,这个TCP 连接就进⼊Established状态,就可以发起http请求了。
看抓包截图:
⑨ 号包 这个就是对应上⾯的步骤 1)
⑩ 号包 这个对应的上⾯的步骤 2)
号包 这个对应的上⾯的步骤 3)
TCP 为什么需要3次握⼿?
举个例⼦:
假设⼀个⽼外在故宫⾥⾯迷路了,看到了⼩明,于是就有下⾯的对话:
⽼外: Excu me,Can you Speak English?
⼩明: yes 。
⽼外: OK,I want ...
在问路之前,⽼外先问⼩明是否会说英语,⼩明回答是的,这时⽼外才开始问路
2个计算机通信是靠协议(⽬前流⾏的TCP/IP协议)来实现,如果2个计算机使⽤的协议不⼀样,那是不能进⾏通信的,所以这个3次握⼿就相当于试探⼀下对⽅是否遵循TCP/IP协议,协商完成后就可以进⾏通信了,当然这样理解不是那么准确。
上海海洋大学分数线为什么HTTP协议要基于TCP来实现?
⽬前在Internet中所有的传输都是通过TCP/IP进⾏的,HTTP协议作为TCP/IP模型中应⽤层的协议也不例外,TCP是⼀个端到端的可靠的⾯向连接的协议,所以HTTP基于传输层TCP协议不⽤担⼼数据的传输的各种问题。
3.建⽴TCP连接后发起http请求
进过TCP3次握⼿之后,浏览器发起了http的请求(看第包),使⽤的http的⽅法 GET ⽅法,请求的URL是 / ,协议是HTTP/1.0
下⾯是第12号包的详细内容:
以上的报⽂是HTTP请求报⽂。
那么HTTP请求报⽂和响应报⽂会是什么格式呢?
世界人口将在2064年达到峰值起始⾏:如 GET / HTTP/1.0 (请求的⽅法  请求的URL 请求所使⽤的协议)
placemoon头部信息:Ur-Agent  Host等成对出现的值
主体
不管是请求报⽂还是响应报⽂都会遵循以上的格式。
那么起始⾏中的请求⽅法有哪些种呢?
GET: 完整请求⼀个资源 (常⽤)
晚上好日语怎么说HEAD: 仅请求响应⾸部
POST:提交表单  (常⽤)time change
PUT: (webdav) 上传⽂件(但是浏览器不⽀持该⽅法)
DELETE:(webdav) 删除
OPTIONS:返回请求的资源所⽀持的⽅法的⽅法
TRACE: 追求⼀个资源请求中间所经过的代理(该⽅法不能由浏览器发出)
那什么是URL、URI、URN?
URI  Uniform Resource Identifier 统⼀资源标识符
URL  Uniform Resource Locator 统⼀资源定位符
格式如下:  scheme://[urname:password@]HOST:port/path/to/source

本文发布于:2023-06-06 10:56:52,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/135834.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   服务器   连接   协议   IP地址   发起   缓存   解析
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图