目录
HTTP部分
解析URL,从而生成发送给Web服务器的请求信息。
也就是解析URL由哪几部分构成的。
下图来源于《小林coding》
关于具体HTTP请求有哪几部分构成的,可以参考前面的文章:
然后,就会构造HTTP请求body
DNS部分
域名层级
在发送之前,还需要DNS来查询域名和与之对应的IP地址之间的映射关系
域名这种东西,一般都是使用.来隔开的:
例如上图的:blog.csdn.net,其中:越往右的域名它的层级越高。
因此在上图当中:其实完整的域名是:blog.csdn.net.
也就是一个完整的域名之后,还有最后一个.(点)
域名层级 | 域名名称 | 域名描述 |
1 | .(是一个点) | 根DNS服务器 |
2 | .net | 顶级域DNS服务器 |
3 | server.com | 权威DNS服务器 |
域名解析过程
客户端首先会发出一个DNS请求,发给本地的DNS服务器。
然后,会不断从大范围的域名(.),也就是最右边的域名。依次从右往左解析域名,范围也逐渐从大到小,最后得出完成的IP地址。
下图来源于《小林coding》
当然,也不是说每一次输入URL地址,都会要经过上述的解析过程的。
DNS缓存
浏览器首先看自身有没有对于这个域名的缓存,如果有,就直接返回。
如果没有,就去操作系统当中查看。有就直接返回,没有就去hosts文件查看。
如果hosts文件当中有,那么就直接读取这个hosts文件的内容。没有的话,就需要经过上述的解析过程。
协议栈
通过DNS解析到正确的IP地址之后,就可以把HTTP的传输工作交给操作系统当中的"协议栈"。
协议栈的内容,分别承担不同的工作,上层的协议会委托下层的协议完成传输。
传输层:TCP协议
HTTP的1.0和2.0版本都是使用TCP协议进行传输的。
关于TCP的协议介绍,已经在这两篇文章当中介绍过了,下面聊几个重点部分的内容。
【网络原理4】TCP特性篇_革凡成圣211的博客-CSDN博客TCP拥塞控制、流量控制、粘包问题、滑动窗口https://blog.csdn.net/weixin_56738054/article/details/129018832?spm=1001.2014.3001.5502【网络原理3】TCP连接管理_革凡成圣211的博客-CSDN博客TCP三次握手、四次挥手
https://blog.csdn.net/weixin_56738054/article/details/128961091?spm=1001.2014.3001.55021.确定源端口和目的端口,如果没有这两个端口,数据就不知道该发给哪一个应用。
2.进行三次握手建立连接(上面文章也提到了)
但是,有时候也有可能会触发一些TCP数据分割:
TCP数据分割(专门分割的是HTTP部分的数据)
如果HTTP请求消息比较长,超过了MSS的长度,这个时候就需要把TCP载荷,也就是(HTTP的数据)分解成多块,而不是一次性发送所有的数据。
MTU:以太网载荷部分的最大长度。
MSS:TCP载荷部分的最大长度。
TCP报文(HTTP部分)数据会被以MSS的长度为单位进行拆分,拆分出来的每一块数据都会被放进单独的TCP包中。也就是在每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块(网络层)来发送数据。
TCP报文生成:
TCP报头当中包含了源端口 ,一个是浏览器监听的端口(随机生成的),另一个是Web服务器的端口(HTTP默认端口是80端口,HTTPS默认是443端口)
然年,TCP载荷部分的内容就是HTTP/HTTPS报文的内容
网络层:IP协议
回顾一下网络层的含义:负责网络地址管理和路由器选择。
在这一层,将会制定具体传输的计划方案,传输路径等等。
但是,还有两个比较重要的概念:那就是:
源IP和目的IP
两点传输:MAC(数据链路层)
关于什么是MAC地址管理,已经在这一篇文章当中提到了:
【网络原理6】数据链路层协议——以太网_革凡成圣211的博客-CSDN博客数据链路层协议:以太网https://blog.csdn.net/weixin_56738054/article/details/129107605?spm=1001.2014.3001.5502就是负责两个相邻节点之间的网络传输。
MAC 发送方和接收方如何确认?
发送方的MAC地址获取就比较简单了,MAC地址是在网卡出厂的时候就已经确定好了的。
对于接收方(下一个网络节点)的IP地址,是怎样确定的,这就是一个比较复杂的过程了。
ARP协议会在以太网当中以广播的形式,喊出来:现在我手上有一个IP地址(下一个网络节点的IP地址),请问这个节点的MAC地址是什么?
但是,并不是每发送一次网络请求,就需要一次"广播"。
后续操作系统会把映射的关系保存到一块内存空间当中留着以后用。
那么,也就变成了,发包的时候:
先查询ARP缓存,如果里面有了接收方的MAC地址,那么就不需要"广播"。
如果没有ARP地址,那么就需要发送ARP广播来查询。
后续,还需要经过网卡、路由器、交换机,然后到达接收方的服务器。
再经过一次逆向转换,接收方就收到了对应的请求了。