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. 1. Linux基本命令

    1. Linux 基本操作 1 基本命令 序号 命令 对应英文 作用 1 ls list 查看当前文件夹下的内容 2 pwd print work directory 查看当前所在文件夹 3 Cd [ ...

  2. ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)

    题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...

  3. appium Ui自动化调起应用点击

    appium Ui自动化调起微信并点击登录按钮的java代码(对的,就这么一丢丢). public class testWX { public static void main(String[] ar ...

  4. luoguP2824 [HEOI2016/TJOI2016]排序(线段树分裂做法)

    题意 所谓线段树分裂其实是本题的在线做法. 考虑如果我们有一个已经排好序的区间的权值线段树,那么就可以通过线段树上二分的方法得到第\(k\)个数是谁. 于是用set维护每个升序/降序区间的左右端点以及 ...

  5. ionic4打包和ngix配置

    ionic4打包 ng run app:build --base-href=/edu/course/mobile压缩打包 ng run app:build:production --base-href ...

  6. 记录错误or日记(更新中)

    前言: 从2018.8-17开始记录 本篇随笔记录做题时的小错误(大多数),考试总结(懒得总结了),做过的每个题的错误 2019.12.7 傻逼学校,给我三个小时假期给你们做题挣工资 2019.11. ...

  7. 【转】Linux设置定时任务方法

    设置:每天4点运行脚本/var/x/web/train/modeltrain [root@T-XXX-ML-01 log]# crontab -e0 4 * * * /var/x/web/train/ ...

  8. 对flutter中,ExpsionPanel的简单改造

    因为项目有大量的下拉面板,而默认的组件(默认的padding.颜色.大小)不是我们UI设计上想要的,但是每个地方都要去改又很麻烦.于是我就想,可以对这个组件进行定制化改造,传入一些颜色.参数.图标大小 ...

  9. h5移动端页面强制横屏

    说明:这个的原文章来自于https://www.jianshu.com/p/9c3264f4a405  ,我做点点补充  ,谢谢原链接的小姐姐 最近公司是要我做一个h5的小视频,因为是视频接视频,并且 ...

  10. 算法六Z自形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L    C     ...