接口基础第三篇:HTTP协议

HTTP请求方式

1 常见请求方式

 

常见的接口类型:

get

它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

格式:请求数参数写在网址后面,用"?"连接,多个参数之间用"&"连接;

场景:get型接口用于获取信息,多用于查询数据,如列表查询功能,点击查询按钮就调用一个get接口,然后把信息返回出来;

特点:1)请求数据量小,2)参数暴露于url地址中,故存在安全隐患。

post

post向服务器提交数据,这个方法用途广泛,几乎目前所有的提交操作都是靠这种方式完成。它用来向指定资源提交数据进行处理请求(例如:提交表单和上传文件),数据包被包含在请求体中,post请求可能导致新的资源的建立或者已有的资源的修改。

 

说明:向指定资源位置提交数据(如提交表单、上传文件)来进行请求,post请求可能会导致新资源的建立。场景:如注册、上传、发帖等功能,如用户在豆瓣网站对某本书进行收藏、写笔记、发表评论。

特点:请求数据量大,安全性高。

如,豆瓣的发表评论的开放api

POST

https://api. douban. com/v2/book/reviews

 put比较少见,HTML表单也不支持此方式。本质上来讲, put和post极为相似,都是向服务器发送数据,但它们之间有一个重要区别,put通常指定了资源的存放位置,而post则没有,post的数据存放位置由服务器自己决定,客户端向服务器传送的数据取代指定文档的内容。

说明:put请求用于向指定资源位置上传最新内容。

场景:如用户在豆瓣网站修改对某本书的收藏、修改某篇笔记或修改评论。 

如豆瓣的修改评论的开放api。

PUT https:// api. douban. com/v2/book/review/ :id

delete

delete删除某一个资源,基本上这个也很少见,比如amazon的S3云服务里面就用的这个方法来删除资源。

 

说明:请求服务器删除请求里url所标识的资源;

场景:如用户在豆瓣网站取消对某本书的收藏、删除某篇笔记或删除评论;

如豆瓣的删除评论的开放api。

DELETE

https://api. douban. com/ v2/book/review/ :id

2 get请求与post请求的区别

 1.提交数据的形式

  • GET方法一般是指获取服务器上的数据,请求参数(query string查询字符串)直接跟着URL后边,以?分割URL和传输数据,参数之间以&相连(?key1=value1&key2=value2)的形式,直接可以放到浏览器地址栏里,例如登录就是采用GET方法。

    如:login.actionname=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

  • POST方法是指客户端给服务器上提交表单数据,会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数,所以POST是通过表单提交的,请求参数放在body中,如网页上的新用户的注册、调查问卷和答题就是采用POST方法。

 2.提交数据的大小/长度

  • get是直接在浏览器地址栏输入,直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响:比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。由于浏览器有限制,一般整个URL的长度可以很长,但是不能超过2049KB的大小限制,而post没有大小限制。

  • post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。所以大小的限制还是得受各个web服务器配置的不同而影响。

 3.提交数据的安全性

  • 由于get的参数是在浏览器地址栏URL直接拼接,用户名和密码将明文出现在URL上,暴露在互联网中,安全性差,不能用来传递敏感信息。

  • post请求参数放在body里,是通过表单数据提交,post比get方式的安全性要高。

get方式安全性弱因为以下几个原因:

(1)登录页面有可能被浏览器缓存;

 (2)其他人查看浏览器的历史纪录,那么别人就可以拿到账号和密码;

 (3)当遇上跨站的攻击时,安全性的表现更差;

 4.编码方式

  • get的参数只能支持ASCII;

  • post没有限制,也允许二进制数据;

5.请求方式

  • get是获取指定的资源

  • post是向指定的资源提交要被处理的数据

 6.请求体

  • get没有请求体;

  • post有请求体;

7.效率方面

  • get产生一个tcp数据包;
  • post产生两个tcp数据包,post需要两步,时间上消耗要多一点,get比post更有效;

8.请求过程

  • 对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据),get请求的过程:

        1.浏览器请求tcp连接(第一次握手);

        2.服务器答应进行tcp连接(第二次握手);

        3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http          会在此时进行第一次数据发送);

        4.服务器返回200OK响应;

  • 而对于post,浏览器先发送header,服务器响应100continue,浏览器再发送data,服务器响应200ok(返回数据),post请求的过程:

        1.浏览器请求tcp连接(第一次握手);

        2.服务器答应进行tcp连接(第二次握手);

        3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在          此时进行第一次数据发送);

        4.服务器返回100 Continue响应;

        5.浏览器发送数据;

        6.服务器返回200 OK响应;

 HTTP请求/响应报文组成

 

1HTTP请求报文

客户端发送一个HTTP请求到服务器的请求消息包括:请求行、请求头部、空行、请求数据四个部分组成。

图片

1.请求行(Request Line)

描述客户端的请求概要信息,包括请求方式、请求地址(URL)、http协议的版本号3个字段组成。

如 POST /mp/webcommreport?action=report&report_useruin=0&__biz=MzI5MTg1NjA4Nw== HTTP/1.1

  • 请求方式:就是HTTP使用的请求方法。

HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。最常的两种GET和POST,RESTful接口的话一般会用到GET、POST、DELETE、PUT。

 

  • 请求地址

URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。

组成:<协议>://<主机>:<端口>/<路径>

注:端口和路径有时可以省略(HTTP默认端口号是80)

如:https://localhost:8080/index.html?key1=value1&keys2=value2

 

  • HTTP协议版本如

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

 

HTTP1.0/HTTP1.1/HTTP 2:

HTTP1.0对于每个连接都只能传送一个请求和响应,请求就会关闭,HTTP1.0没有Host字段;

HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段;

在HTTP 2.0中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始HTTP报文的一部分以HTTP/2发送出来,每条报文的语义依旧不变,客户端会重组原始HTTP/1.1请求。因此用HTTP/1.1格式来理解HTTP/2报文仍旧有效。

图片

2.请求头(Request Headers)

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。包含客户机请求的服务器主机名,客户机的环境信息等。HTTP客户程序(如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。

 

常见的请求头字段含义:

Host:客户端通过这个服务器,想访问的主机名,Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

Connection:告诉服务器,请求完成后,是否保持连接;如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

 

Accept:用于告诉服务器,客户端支持的数据类型(例如:Accept:text/html,image/*、image/webp,*/*);

 

Accept-Encoding:用于告诉服务器,客户端支持的数据压缩格式。

 

Accept-Language:客户端语言环境,当服务器能够提供一种以上的语言版本时要用到。

 

Accept-Charset:用于告诉服务器,客户端采用的编码格式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面,许多情形下这可以减少5到10倍的下载时间。

 

Content-Length:表示请求消息正文的长度。

 

Cookie:客户端通过这个头,将Coockie信息带给服务器,这是最重要的请求头信息之一。

 

Referer:客户端通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链),包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间,只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。

 

User-Agent:客户端通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等),如果Servlet返回的内容与浏览器类型有关则该值非常有用。

Date:告诉服务器,当前请求的时间。

 

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

 

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

 

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

 

Range:Range头域可以请求实体的一个或者多个子范围。如:

表示头500个字节:bytes=0-499

表示第二个500字节:bytes=500-999

表示最后500个字节:bytes=-500

表示500字节以后的范围:bytes=500-

第一个和最后一个字节:bytes=0-0,-1

同时指定几个范围:bytes=500-600,601-999

但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。


图片

 

 

 

图片

 

 

3.空行(Blank Line)

它的作用是通过一个空行,告诉服务器请求头部到此为止。接下来为请求数据,这一行非常重要,必不可少。

 

4.请求数据(Request Data)

    可选部分

    若方法字段是GET,则此项为空,没有数据;

    若方法字段是POST,则通常来说此处放置的就是要提交的数据;可以包含客户提交的查询字符串信息。如username=zhangsan&password=123,在实际应用中,HTTP请求正文可以包含更多的内容。

post请求示例:

图片

比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。

图片

 ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST。 

 

②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。

 

③是协议名称及版本号。 

 

④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。 

 

⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

 

 

 

2HTTP响应报文

 

HTTP响应报文由三部分组成:响应行、响应头、响应体。

图片

图片

 

1.响应行(Response Line)

在接收和解释请求消息后,服务器会返回一个HTTP响应消息。

响应行由协议版本、状态码及相应的状态描述组成,各元素之间以空格分隔。

格式:    HTTP-Version Status-Code Reason-Phrase CRLF

例如:    HTTP/1.1 200 OK 

其中,协议版本HTTP/1.1或者HTTP/1.0,200是状态码,OK则为描述。状态描述给出关于状态代码的简短的文字描述。

HTTP状态码(HTTP Status Code)

由3位数字组成,表示请求是否被理解或被满足。

图片

状态码详解:

 

100~199(信息性) 

表示临时响应并需要请求者继续执行操作的状态代码。

100 :继续(Continue) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分

101 :切换协议(Switching Protocols) 请求者已要求服务器切换协议,服务器已确认并准备切换

 

 200~299(成功) 

表示成功处理了请求的状态代码。

200 :成功(OK)  服务器已成功处理了请求。通常,这表示服务器提供了请求的网页

201 :已创建(Created)  请求成功并且服务器创建了新的资源,,且其URL已经随Location头信息返回

202:已接受(Accepted )  服务器已接受请求,但尚未处理。

203 :非授权信息(Non-Authoritative Information )  服务器已成功处理了请求,但返回的信息可能来自另一来源。

204 :无内容(No Content)  服务器成功处理了请求,但没有返回任何内容

205 :重置内容(Reset Content) 服务器成功处理了请求,但没有返回任何内容

206:部分内容(Partial Content )  服务器成功处理了部分 GET 请求

 

300~399(重定向) 

表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。

300 :多种选择(Multiple Choices)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 

301  :永久移动(Moved Permanently)  请求的网页已永久移动到新URL。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置,今后任何新的请求都应使用新的URL代替。

302 :临时移动(Found )  服务器目前从不同位置的网页响应请求,资源只是临时被移动,但请求者应继续使用原有URL来进行以后的请求。 

303 : 查看其他位置(See Other) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 

304 : 未修改(Not Modified) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 

305 : 使用代理(Use Proxy) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 

306  已经被废弃的HTTP状态码(Unused)

307 :临时重定向(Temporary Redirect )  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。与302类似,使用GET请求重定向。

 

400~499(客户端请求错误) 

这些状态代码表示请求可能出错,妨碍了服务器的处理。

400 :错误请求(Bad Request ) 客户端请求的语法错误,服务器无法理解 

401 :未授权(Unauthorized) 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。 如果当前请求已经包含了Authorization证书,那么401响应代表着服务器验证已经拒绝了那些证书.

402 保留(Payment Required ),将来使用

403 :禁止(Forbidden) 服务器已经理解请求,但是拒绝执行请求。 

404 :未找到(Not Found )请求失败, 服务器找不到请求的网页(资源)。 

405  :方法禁用( Method Not Allowed ) 禁用请求中指定的方法。 

406  :不接受(Not Acceptable) 无法使用请求的内容特性响应请求的网页。 

407 :需要代理授权(Proxy Authentication Required ) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。 

408  :请求超时(Request Time-out )  服务器等待客户端发送的请求时间过长,发生超时。 

409 :冲突(Conflict )  服务器在完成请求时发生冲突, 服务器必须在响应中包含有关冲突的信息。 

410 :已删除( Gone)  如果请求的资源已永久删除,服务器就会返回此响应。 410不同于404,如果资源以前有现在被永久删除了可使用410代码

411 :需要有效长度(Length Required ) 服务器不接受不含有效内容长度Content-Length标头字段的请求。 

412  :未满足前提条件(Precondition Failed ) 服务器未满足请求者在请求中设置的其中一个前提条件。 

413  :请求实体过大( Request Entity Too Large ) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息

414  :请求的 URI 过长(Request-URI Too Large) 请求的 URI(通常为网址)过长,服务器无法处理。 

415  :不支持的媒体类型(Unsupported Media Type) 请求的媒体格式不受请求页面的支持。 

416 :请求范围不符合要求(Requested range not satisfiable ) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 

417  :未满足期望值(Expectation Failed ) 服务器未满足”期望”请求标头字段的要求。

 

500~599(服务器错误) 

这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

500 :  服务器内部错误( Internal Server Error )  服务器遇到未曾预料的状况,无法完成请求。 一般来说,这个问题都会在服务器的程序码出错时出现。

501:   尚未实施(Not Implemented ) 服务器不具备完成请求的功能,无法完成请求。例如,服务器无法识别请求方法时可能会返回此代码。 

502:  错误网关 (Bad Gateway) 服务器作为网关或代理,从上游服务器收到无效响应。 

503 :  服务不可用(Service Unavailable ) 服务器目前无法使用(由于超载或停机维护),延时的长度可包含在服务器的Retry-After头信息中。通常,这只是暂时状态,将在一段时间以后恢复.

504:   网关超时(Gateway Time-out )  服务器作为网关或代理,但是没有及时从上游服务器收到请求。 

505 :  HTTP 版本不受支持(HTTP Version not supported) 服务器不支持请求中所用的 HTTP 协议版本。

 


图片

 

 

 

2.响应头(Response headers)

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。

 

设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可以用来完成:设置Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接……等等许多其他任务。

 

常见的响应头字段含义:

 

Allow:服务器支持哪些请求方法(如GET、POST等)。

 

Content-Encoding:告诉浏览器,服务器的数据压缩(Encode)格式。实体报头域被使用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而要获得Content- Type报头域中所引用的媒体类型,必须采用相应的解码机制。有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。

 

Content- Type:告诉浏览器,回送数据的类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。

 

Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

 

Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。

 

Last-Modified:告诉浏览器当前资源缓存最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

 

Location:响应报头域用于重定向接受者到一个新的位置,这个头配合302状态码使用,告诉客户端找谁,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

 

Refresh:告诉浏览器隔多久刷新一次,以秒计。

 

Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。

 

Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。

 

Transfer-Encoding:告诉浏览器,传送数据的编码格式。

 

WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。

 

setContentType:设置Content-Type头。大多数Servlet都要用到这个方法。

 

setContentLength:设置Content-Length头。对于支持持久HTTP连接的浏览器来说,这个函数是很有用的。

 

addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。

 

Cache-Control:控制浏览器不要缓存数据   no-cache

 

 

 


图片

 

 

 

 

3.响应体(Response Body)

响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。

HTTP响应报文格式就如下图所示:

图片

①报文协议及版本; 

②状态码及状态描述; 

③响应报文头,也是由多个属性组成; 

④响应报文体,即我们真正要的“干货”。 

 


 

 

3HTTP请求/响应步骤

 

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

图片

客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容。

 

1.客户端连接到Web服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com

2.发送HTTP请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

3.服务器接受请求并返回HTTP响应Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

4.释放连接TCP连接

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

5.客户端浏览器解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

HTTP请求消息Request客户端发送一个HTTP请求到服务器的请求消息包括以下格式请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

 

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

5.释放 TCP连接;

6.浏览器将该 html 文本并显示内容;  

 

 


 

4HTTP请求特点

 

 

1.基于请求/响应,支持客户端/服务器模式

客户端发送请求,服务器端响应数据。客户端向服务器请求服务时,只需要传送请求的方法和路径即可。常用的请求方法有get(查)、post(增),除此之外还有put(改)、delete(删)等,每种方法规定的客户端与服务器联系的方式不同,日常工作中见到的最多的是get和post两种。

图片

 

2.基于TCP/IP协议之上的应用层协议,简单灵活

HTTP简单,服务器的程序规模小,通信速度快;HTTP使用TCP作为它的支撑运输协议,HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP,HTTP运行传输任意类型的数据对象。

图片

 

3.无状态

协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,(一刀两断,恩断义绝,从此路人!)下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。

图片

4.无连接

限制每次连接,使其只处理一个请求。服务器处理完客户端的请求并收到客户端的应答后,即断开连接,这种方式可以节省传输时间。

 

 

转自:https://mp.weixin.qq.com/s?__biz=MzI5MTg1NjA4Nw==&mid=2247486271&idx=1&sn=a97c366054f2c1432f37a8013f104b50&chksm=ec0b0087db7c8991a18fa1ec1894c72f0572b936035d7477e24f57500a1d27949476ad04d7af&scene=21#wechat_redirect

posted @ 2021-11-03 00:26  术科术  阅读(854)  评论(0编辑  收藏  举报