http协议(超文本传输协议)是属于应用层的协议,网络分层:应用层(http协议,FTP),传输层(tcp,udp),网络层(ip/ARP),链路层

我们以浏览器向百度发送请求为例:

http的发送:

浏览器发送请求,这个请求是http请求,首先构建http报文,http请求报文由三部分组成,请求行、请求头、请求体

请求行内容:http协议的版本号,以及请求方式,请求的方式有get,post,put,delete,head等等

请求头内容:是基于key-value的形式,好比我们常见的content-type,告诉接受方我发送的请求体的内容格式是什么样的,一般是json格式,还有什么accept-charset表示我可接受的编码类型等等其他的

请求体:就是我们需要传输给服务器(百度)的内容

以上是属于应用层做的事,接下来到了传输层,http请求是基于tcp协议的,所以此时tcp登场,一般使用socket进行通信,我们不用自己编写,浏览器内部已经帮我们实现好了,记住socket是属于应用层的,tcp连接需要三次握手,tcp层每送一个报文,都需要加上源地址和目标地址,放在ip头里面,然后交给网络层进行传输,到了网络层,网络层会取下ip头,查看目标地址看是否是和自己在同一个局域网中,如果在通过发送ARP协议来获取目标地址的mac,然后将源mac和目标mac放入到mac头里面,发送出去,如果不在,需要将包发送到网关,此时需要获取网关的mac,通过arp协议来获取网关的mac,将源mac和网关的mac写入到mac头里面发送出去,网关(具有取下mac头和ip头能力, 即三层设备)收到包,取下mac头发现mac符合,取出ip地址,根据路由协议找到下一跳的地址,然后通过arp找到下一跳的mac,将自己的mac和下一跳mac写入到mac头里面,发送出去,下一跳收到包之后,发现mac和自己符合,然后取出ip,发现ip就是自己局域网内的ip,通过arp找到百度服务器所在机器的mac,将此mac和自己的mac写入到mac头里面发送出去,百度服务器所在的机器收到此包之后,发现mac符合,将包给网络层,IP层取出ip地址,发现ip地址符合,给tcp层,然后解析tcp头,里面有序列号,查看这个序列包是不是自己要的,如是就放入到缓存,然后回复一个ack,如果不是就丢弃,tcp头里面有端口号,http服务器正在监听这个端口,然后将包发送给http服务器,http服务器进程看到,原来请求是访问一个网页,然后将网页发送给客户端。

http的返回:

http响应报文也是由三部分组成:响应行,响应头,响应体

响应行内容:协议版本,状态码,好比200成功响应,404访问资源不存在,500服务器内部错误等等

响应头:基于key-value 形式,好比:Connection:keep-alive 保持连接content-type表示响应体格式,一般json,Last-Modified 最后一次更新的时间等等之类的

响应体:就是返回的网页的内容

下一步到了传输层,会将报文加上tcp头,tcp头,里面有源端口,目标端口,序号,确认序号等等,然后到网络层,将源ip和目标ip写入到ip头里面去,网络层会根据你要发送的目标ip地址,知道是在局域网里,还是在另一个网络内,如果是在本地局域网里,直接通过arp获取目标地址的mac,如果不是在同一个局域网里里面,通过arp获取网关的mac,然后将网关mac和自己的mac写入到mac头里面,然后发送出去,到达网关,网关是具有解析出mac头和ip头的能力,取下mac,发现就是发给自己的,然后取出ip,查找到下一跳的地址,网关分为转发网关和nat网关(转换网关),区别就是会改变ip头里面的源ip地址,mac地址是一定会变化的,然后将包发送出去,到了下一跳的网关接收到包,发现mac是自己的,解析出ip地址,然后通过arp,找到目标地址的mac,然后将目标mac和源mac写入到mac头里面,发送出去,到达目标机器,发现mac是自己的,将包个ip层,然后取出ip,发现ip也是自己的,将包个传输层,取出tcp报文,根据序列号查看是不是自己需要的报文,如果是发送给监听对应端口的进程,然后进行处理

一次http请求的过程的更多相关文章

  1. SpringMVC处理客户端请求的过程

    SpringMVC处理客户端请求的过程 以程序部署在Tomcat上为例,网站程序使用SpringMVC框架开发. 1.客户端发起一个访问网站的请求(如: localhost:8080/index). ...

  2. Java Web容器的启动与处理请求的过程

    容器启动时的加载顺序 一.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<context-param>结点.二.容创建一个ServletContext(ser ...

  3. live555学习之RTSP连接建立以及请求消息处理过程

    1,RTSP连接的建立过程    RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话.    首先创建RTSP服务 ...

  4. HTTP请求响应过程 与HTTPS区别

    原文:HTTP请求响应过程 与HTTPS区别 HTTP协议学习笔记,基础,干货 HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏 ...

  5. Asp.Net请求响应过程

    Asp.Net请求响应过程 在之前,我们写了自己的Asp.Net框架,对整个流程有了一个大概的认识.这次我们来看一下Asp.Net整个请求处理过程是怎么样的. 浏览器封装请求报文,发送请求到达服务器, ...

  6. live555_RTSP连接建立以及请求消息处理过程

    1,RTSP连接的建立过程    RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话.    首先创建RTSP服务 ...

  7. (转)关于Tomcat的点点滴滴(体系架构、处理http请求的过程、安装和配置、目录结构、设置压缩和对中文文件名的支持、以及Catalina这个名字的由来……等)

    转自:http://itfish.net/article/41668.html   总结Tomcat的体系架构.处理http请求的过程.安装和配置.目录结构.设置压缩和对中文文件名的支持.以及Cata ...

  8. 网站开发进阶(四)Tomcat Server处理一个http请求的过程

    Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...

  9. Tomcat系列(6)——Tomcat处理一个HTTP请求的过程

    Tomcat的架构图   图三:Tomcat Server处理一个HTTP请求的过程 处理HTTP请求过程 假设来自客户的请求为:http://localhost:8080/test/index.js ...

  10. Tomcat Server处理一个http请求的过程

    Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...

随机推荐

  1. [日常] 前端资源测试机上忽略版本号的的nginx配置

    利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向).permanent(永久重定向).break和last.其中前 ...

  2. greenlet实现协程

    #greenlet 1 import time from greenlet import greenlet # greenlet可以实现一个自行调度的微线程 def work1(): while Tr ...

  3. socket.error: [Errno 10048]

    socket.error: [Errno 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 经过搜索发现这个提示是在端口冲突的时候出现,可能的原因是在服务器程序中创建一个Sock ...

  4. 肖哥讲jquery:

    jquery 是一个模块 一个库 js封装的一个库 导入jq  <script src="jquery.js"></script>   <script ...

  5. MySQL 字符集与比较规则

    MySQL 字符集与比较规则 由于 MySQL 客户端与服务端之间通信时需要将字符串编码传输,所以不可避免会产生编码转换 字符集 MySQL 中 utf8 就是 utf8mb3,只使用 1-3 个字节 ...

  6. 用Node.js给邮箱发送邮件

    首先我们需要做的是下载发送邮件的包 cnpm install nodemailer --save 然后写发送邮件的代码,代码如下: 实现原理是:用你的邮箱给其他邮箱发送邮件,所以这里需要填写你的邮箱和 ...

  7. A1029 Median (25 分)

    一.技术总结 最开始的想法是直接用一个vector容器,装下所有的元素,然后再使用sort()函数排序一下,再取出中值,岂不完美可是失败了,不知道是容器问题还是什么问题,就是编译没有报错,最后总是感觉 ...

  8. AtCoder Grand Contest 036

    Preface 这篇已经鸽了好久的说,AGC037都打完了才回来补所以题目可能都记不大清楚了,如有错误请指正 这场感觉难度远高于上一场,从D开始就不会了,E没写(看了题解都不会写),F就是抄曲明姐姐的 ...

  9. Debug 路漫漫-13:Python: pandas IndexError: single positional indexer is out-of-bounds

    在数据预处理过程中,出现:IndexError: single positional indexer is out-of-bounds 原因是在使用 Pandas 读取 dataframe 的时候,分 ...

  10. MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。

    MySQL如果频繁的修改一个表的数据,那么这么表会被锁死.造成假死现象. 比如用Navicat等连接工具操作,Navicat会直接未响应,只能强制关闭软件,但是重启后依然无效. 解决办法: 首先执行: ...