http请求全过程
第一步:浏览器生成http请求信息(第五层)
1.分解url
当用户输入网址时,浏览器会以一定的规则分解网址,
以 http://www.cemabenteng.com/dir/index.html 为例进行分解,
http为请求的协议名称,www.cemabenteng.com为请求的web服务器,dir/index.html为请求的资源,
(如果是静态资源,则dir为该服务器上的目录,index.html为该目录上的资源,如果是动态资源,则服务器会根据请求的资源名称动态提供资源)
2.生成http请求消息
消息格式: <方法 URI http版本>
<消息头>
<消息体>
2.1 方法
当用户输入网址,或者点击超链接请求服务器时,使用的是GET方法
当提交form表单时,使用form页面设置的方法
2.2 URI
即上例中的dir/index.html
2.3 http版本
一般为1.1
2.4 消息头
与请求相关的一些信息,例如我们熟知的cookie,User-Agent(使用的浏览器类型及版本)等。
2.5 消息体
消息体存放请求中携带的数据,因为GET方法所携带的数据都在URL中,因此消息体没有内容。而POST方法所携带的数据就存放于此。
3.域名解析
生成消息后,浏览器会调用操作系统的DNS客户端向DNS服务器查询域名对应的IP地址。
3.1 浏览器将域名(即上例中的www.cemabenteng.com)发送给DNS服务器,
3.2 DNS客户器将域名生成域名查询消息并发送给tcpip协议驱动,
3.3 tcpip协议驱动使用网卡将消息发送给最近的DNS服务器,
3.4 最近的DNS服务器将消息发送给根服务器,然后逐级向下查询,直到查询到结果返回。
ps:DNS查询使用UDP协议,只发送一个包,而由于包大小有限,只能容下13个根服务器信息,因此世界上只有13个根服务器,国内只有根服务器镜像。
4.委托操作系统发送http请求
浏览器将IP地址和请求消息发送给操作系统,委托操作系统发送出http请求。
第二步:TCP模块发送请求(第四层)
1.创建套接字
操作系统在接到请求后,首先会申请一块用于存放一个套接字所需的内存空间,套接字是存放了一些通信相关的控制信息的集合。
然后向这个内存空间写入一些初始状态,并把该套接字的唯一标识告诉应用程序,即浏览器。
2.连接服务器
连接服务器就是通信双方交换控制信息。操作系统首先接受浏览器给出的服务器地址,然后申请数据缓存空间并创建TCP头部,通过
委托ip模块,向服务器传达开始通信的请求。服务器会返回连接成功的信息,之后会向套接字中写入服务器的ip等信息,并标识状态为已连接。
最后客户端返回接收相应成功的信息给服务器,连接就算成功完成了。当没有收到确认信息时,会重新发送,多次失败后才会向外报错。
(这就像一个快递公司,有很复杂的机制)
3.发送数据
操作系统收到数据后会将数据存放在的发送数据缓存区中,并等待接收后续数据,只有当接收的数据达到一个网络包的大小的时候,或者达到最大等待时间之后,
才会委托ip模块发送出去。浏览器数据量小、对性能要求高,一般会设置为直接发送。一般的http请求数据用一个网络包就够了,但有时提交的表单数据较大时,会拆分成
多个网络包发送。
第三步:IP模块发送请求(第三层)
1.生成IP头部
IP模块在发送数据前,会生成IP头部,再附上要发送的数据。IP头部包含IP地址等信息。
2.生成MAC头部
生成IP头部后,还会在前面加上MAC头部。它包含了MAC地址等信息。MAC地址需使用IP通过ARP协议查询。每次转发过程都会更换下一个网络设备的MAC地址。
第四步:MAC模块发送请求(第二层)
1.生成报头
mac模块会在网络包的开头加上报头和起始帧分界符。报头是一串固定频率的时钟信号,它用于确定数据每一位的读取时机。
报头后面是起始帧分界符,它的末尾序列比起报头有一点变化,用来标记报头的结束,网络包的开始。
2.生成校验序列
除了开头的报头,末尾还会加上帧校验序列,校验序列是通过整个包计算出来的,用于校验包的正误。类似身份证的校验码。
3.生成电信号
帧组装完毕后,便会转换成通用的电信号并委托PHY模块发送。
第五步:PHY模块发送请求(第一层)
最终网卡中的PHY模块会将通用电信号转换成网络传输所需的格式,通过网线发送出去。经过网络转发后,最终到达服务器。
。。。
最后,服务器反向重复上述步骤,把电信号逐步转换回http请求信息并进行处理。
ps:上述内容纯属博主个人理解,如有谬误,还望指出。
http请求全过程的更多相关文章
- SpringMVC 请求全过程漫谈
SpringMVC 请求全过程漫谈 SpringMVC 跟其他的mvc框架一样,如 struts,webwork, 本质上都是 将一个 http 请求(request)进行各种处理, 然后返回resp ...
- Linux 下curl模拟Http 的get or post请求
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...
- Linux下开发常用 模拟 Http get和post请求
1.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "htt ...
- Linux 下模拟Http 的get or post请求(curl和wget两种方法)
一.get请求: 1.使用curl命令: curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地curl -i & ...
- curl模拟Http请求
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http://w ...
- Linux命令模拟Http的get或post请求
Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求. get请求: 1.使用curl命令: cur ...
- linux 测试 get 请求 跳过SSL证书验证
Linux 下测试 get 请求: curl : curl "http://www.qq.com" # 标准输出页面内容 curl -i "http://www.qq.c ...
- Linux(centos) 下curl模拟Http get / post请求 [ curl ]
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...
- Linux系统如何模拟Http的get或post请求?
一.get请求: 1.使用curl命令: curl “http://www.baidu.com” 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i “http://www ...
随机推荐
- Go语言内存分配机制
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- [GO]goexit的使用
package main import "fmt" func test() { defer fmt.Println("cccccccccccc")//在函数退出 ...
- RMAN备份(转)
原文:http://blog.csdn.net/leshami/article/details/6032739 一.数据库备份与RMAN备份的概念 1.数据库完全备份:按归档模式分为归档和非归档 归档 ...
- Spring框架总结(十二)
问题引入: 程序的“事务控制”, 可以用aop实现! 即只需要写一次,运行时候动态植入到业务方法上. 一个业务的成功: 调用的service是执行成功的,意味着service中调用的所有的d ...
- javascript总结37:DOM:innerText 和 innerHTML
innerText 和 innerHTML 作用: 给双标签的元素设置内容/获取双标签里面的内容 不同点: innerText 只是用于获取文本或设置文本 innerHTML 不仅可以用于设置/获取文 ...
- Tomcat version 6.0 only supports J2EE 1.2 ......
在project的.setting folder下面,有个名为org.eclipse.wst.common.project.facet.core.xml的文件,里面配置有各种版本信息.此时,按照本机配 ...
- HBase介绍(2)---数据存储结构
在本文中的HBase术语:基于列:column-oriented行:row列组:column families列:column单元:cell 理解HBase(一个开源的Google的BigTable实 ...
- 菜鸟的Xamarin.Forms前行之路——绪言
作者入门时间不是很久,差不多一年,期间自学的东西比较杂乱,到目前为止,编程方面的知识比较薄弱.之所以做这个系列,也只是因为做了两个月的Xamarin.Forms方面的东西,由于资料和自身实力的原因,过 ...
- python学习之路 一 :编程语言介绍
本节重点 理解编程语言是什么? 大体明白,编程语言是如何与计算机底层通信的编程语言有哪些分类? 分别列举主流编程语言的特点 什么是编程,为什么要编程 一.什么是编程语言?为什么要编程? 编程:是个动词 ...
- 编写高质量JS代码中
前段时间看了几道关于前端javascript的面试题目,方觉函数调用模式等基础的重要性.于是,下定决心,好好补补基础,即便不能深入语言的内部设计模式,也要对基本面向对象概念有比较深入的理解. 继续上一 ...