HTTP请求流程

hhtp请求流程

首先http是一个应用层的协议,在这个层的协议,只是一种通讯规范,也就是因为双方要进行通讯,大家要事先约定一个规范。

http请求与响应的步骤如下:

  • URL解析、域名解析
    输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP。如果url里不包含端口号,则会使用协议的默认端口号。

    浏览器根据访问的域名找到其IP地址。DNS查找过程如下:

    1)浏览器缓存:浏览器会缓存DNS记录一段时间。 但操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。

    2)系统缓存:如果在浏览器缓存里没有找到需要的域名,浏览器会做一个系统调用(windows里是gethostbyname),这样便可获得系统缓存中的记录。

    3)路由器缓存:如果系统缓存也没找到需要的域名,则会向路由器发送查询请求,它一般会有自己的DNS缓存。

    4)ISP DNS缓存:如果依然没找到需要的域名,则最后要查的就是ISP缓存DNS的服务器。在这里一般都能找到相应的缓存记录。

  • 产生请求数据

    根据返回的IP和URL解析得到的参数,结合应用层的协议,确定发送的数据内容,将这些数据放到一个缓冲区内,然后形成了应用层的报文data。

    此时,将应用层的报文data发送到传输层。经过传输层处理,如报文打上了传输头的包头(主要包含端口号,以及tcp的各种信息),得到tcp的数据传送单位segment。

  • 建立网络连接并发送请求包

    拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024< 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。

    采用ip地址+协议+端口号唯一标示网络中的一个进程,利用socket进行通信。基于socket进行TCP三次握手,建立TCP连接。然后浏览器发起了http的请求。

    将传输层的数据段送到网络层,在网络层被打包,这样封装上了网络层的包头,包头内部含有源及目的的ip地址,该层数据发送单位被称为packet。网络层开始负责将这样的数据包在网络上传输,如何穿过路由器,最终到达目的地址。

  • 返回响应数据

  • 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)

  • 浏览器对页面进行渲染呈现给用户

  • 断开网络连接

    若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

HTTP请求格式和返回格式

  • 请求格式

    HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行

    1
    2
    3
    4
    5
    6
    <request-line>
    <general-headers>
    <request-headers>
    <entity-headers>
    <empty-line> // (用于分割请求头和消息体)
    [<message-body>]
    • 请求行中包含的请求方法:

      1
      2
      3
      4
      5
      GET: 完整请求一个资源 (常用)
      HEAD: 仅请求响应首部
      POST:提交表单 (常用)
      PUT: 上传
      DELETE:删除
  • 响应格式

    为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开

    HTTP响应格式
    服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。

    1
    2
    3
    4
    5
    6
    <status-line>
    <general-headers>
    <response-headers>
    <entity-headers>
    <empty-line>
    [<message-body>]
常用的HTTP头信息有([一个http请求的详细过程](https://www.jianshu.com/p/aa97810e5fa4)):① HTTP 1.0 200 OK  这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。② MIME_Version:1.0 它指示MIME类型的版本。③ content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。④ content_length:长度值 它指示HTTP体信息的长度(字节)。

Socket

WEB Server都是基于Socket编程,又称之为网络编程,网络协议通过一个叫做socket的对象抽象出来,socket可以建立网络连接,读数据,写数据。socket模块定义了一些常量参数,用来指定socket的的地址族、socket的类型、以及支持的TCP/IP协议。

利用ip地址+协议+端口号唯一标示网络中的进程,然后利用socket进行通信。

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

通常传输层的服务通过系统调用的方式提供,以socket的方式。对于客户端,要想建立一个socket连接,需要调用这样一些函数socket() bind() connect(),然后就可以通过send()进行数据发送。

参考:

  1. 一次完整的HTTP请求过程
  2. 一个http请求的详细过程
  3. TCP与SOCKET的三次握手的对应关系
  4. 三次握手 四次握手 与socket函数的关系
  5. http请求与响应全过程
  6. 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP执行外部程序的方法

引言在一些特殊情况下&#xff0c;会使用PHP调用外部程序执行&#xff0c;比如&#xff1a;调用shell命令、shell脚本、可执行程序等等 PHP执行外部程序的方法 system()&#xff0c;system函数将执行的结果直接输出exec()&#xff1a;执行一个外部程序&#xff0c;将输出结果保…

C语言函数变量的引用

C语言函数变量的引用 有时候&#xff0c;你想引用函数中的某些变量。 #include <stdio.h>int main() {struct guoba{int pang;int piqi;};void tong(int *p){int month1 3;int month5 8;struct guoba xiaoguoba;xiaoguoba.pang month1 month5;*p xiaoguoba.pang ;…

php 终止程序的方法——return、exit()、die()

php中终止程序的运行有三种方式&#xff1a; return&#xff0c;主脚本程序中使用exit()&#xff0c;脚本中使用die()&#xff0c; 脚本中使用三者所在的脚本文件他们之后的代码都不会执行了。php开发模式下想直接看到变量的值使用exit()、die()。 returnreturn是语言结构而不是…

Eric Evans说DDD还未结束

在Explore DDD 2018大会上&#xff0c;Eric Evans做了“怀疑、乐观和实用主义”的主题演讲&#xff0c;他在演讲中表示&#xff0c;“DDD还没有结束”。在“领域驱动设计”这本书出版十五年之后&#xff0c;作者对这个想法长期以来如此流行表示了惊讶之情。他强调&#xff0c;D…

mark

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C语言的进阶-指针的应用

指针的应用 #include <stdio.h> void swap(int *p,int *q); int main() {int a 5;int b 8;swap(&a,&b);printf("a%d,b%d\n",a,b);return 0; }void swap(int *p,int *q) {int t *p;*p *q;*q t; }函数只能返回一个值&#xff01; 可以通过参数返回多…

Go简单开始

Go是一门编译型语言&#xff0c;Go语言的工具链将源代码及其依赖转换成计算机的机器指令2。Go语言提供的工具都通过一个单独的命令 go 调用&#xff0c; go 命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件&#xff0c;链接库文件&am…

C语言进阶-指针与数组

C语言进阶-指针与数组 q可以改变指向的内容&#xff0c;但不能改变指向的地址 p可以改变指向地址&#xff0c;但不能改变指向内容

测试下文章

这是一篇测试 编辑

发布文章测试

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C语言进阶-指针运算

C语言进阶-指针运算 #include <stdio.h>int main() {char a[] {0,1,2,3,4,5,6,7,8,9};char *p a;printf("p%d\n",p);printf("p1%d\n",p1);int b[] {0,1,2,3,4,5,6,7,8,9};int *q b;printf("q%d\n",q);printf("q1%d\n",q1);r…

vim的模式及常用命令

vim的模式正常模式 (Normal-mode) &#xff1a; 左下角显示文件名或为空。 启动vim后默认处于正常模式。不论位于什么模式&#xff0c;按下<Esc>键(有时需要按两下&#xff09;都会进入正常模式。 插入模式 (Insert-mode)&#xff1a;左下角显示–INSERT– 在正常模式中…

C语言进阶-动态内存分配

C语言进阶-动态内存分配 #include <stdio.h> #include<stdlib.h>int main() {int number;int *a;int i;printf("请输入数组的数量");scanf("%d",&number);//int a[number];a(int*)malloc(number*sizeof(int));//开辟数组的大小for(i 0;i&…

测测

编辑 1.多喝水 2.清黑头&#xff0c;一周做一次角质&#xff0c;一个月做一次小气泡 3.防晒 无论春夏秋冬 4.少吃辣&#xff0c;多喝柠檬水 5.早上护肤步骤&#xff1a;洁面-爽肤水-眼霜-精华-面霜-防晒 6.晚上护肤步骤&#xff1a;卸妆-洁面-水-眼霜-精华-面霜 7.一周三…

QT输出出现乱码的解决

QT输出出现乱码的解决

测试图片外链MD

11111 11111111111111111111111111111 555555555

测试阿里云HTML

一直在说事件&#xff0c;那么事件到底是指什么&#xff1f;这里所说的事件是指手指按下(down)、移动(move)、抬起(up)此为一个事件集合或者说是事件序列&#xff0c;从手指接触屏幕开始到手指离开屏幕结束。所以本篇所说的事件序列或者事件集合是指从手指刚接触屏幕到离开屏幕…