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. python使用face_recognition包的环境设置

    在使用face_recognition包进行人脸识别时,环境是非常重要的,但是网上办法特别纷杂,今天介绍一种特别简单的办法,希望能帮助到大家,少走些坑. 1.首先应该下载dlib安装包(例如:dlib ...

  2. CUDA 与 OpenGL 的互操作

    CUDA 与 OpenGL 的互操作一般是使用CUDA生成数据,然后在OpenGL中渲染数据对应的图形.这两者的结合有两种方式: 1.使用OpenGL中的PBO(像素缓冲区对象).CUDA生成像素数据 ...

  3. PHP 自动加载

    回顾 开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显: 如果需要引入很多文件, 就需要很多的incl ...

  4. 3、zabbix组件之间的关系

    我们在安装zabbix的时候安装了四个软件:zabbix-server.zabbix-server-mysql.zabbix-web-mysql.zabbix-agent,那么这个四个软件之间有什么关 ...

  5. 【BZOJ3600】没有人的算术(替罪羊树+线段树)

    点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. ...

  6. 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)

    打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...

  7. k8s云集群混搭模式落地分享

    在 <k8s云集群混搭模式,可能帮你节省50%以上的服务成本>一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具有时间段波峰.波谷交替规律的业务节约成本,提高服务伸缩效率的部署 ...

  8. Java连载36-IDE使用

    一.主方法注意 每一个类都可以编写一个主方法,但是一般情况下,一个系统只有一个入口,所以主方法一般写一个 二.Myeclipse的使用 1.在workspace中工作区中有一个文件夹.metadata ...

  9. http状态码大全(404、505、502,500)

    HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 ...

  10. RabbitMQ如何保证消息99.99%被发送成功?

    1. 本篇概要 RabbitMQ针对这个问题,提供了以下几个机制来解决: 生产者确认 持久化 手动Ack 本篇博客我们先讲解下生产者确认机制,剩余的机制后续单独写博客进行讲解. 2. 生产者确认 要想 ...