HTTP

一、HTTP工作过程

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

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。

2. 发送HTTP请求

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

3. 服务器接受请求并返回HTTP响应

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

4. 释放连接TCP连接

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

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

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


二、请求报文(request)

HTTP协议使用TCP协议进行传输,在应用层协议发起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客户端会向服务器发出一个请求报文。请求报文的格式如下图抓包所示:


2.1注释:

字段意义

Method:表示这次请求使用的是方法。常用方法有:GET/POST

URI:表示请求的页面地址,图中的“/”表示服务器的根目录。

Version:表示http的版本。

Accept:请求的对象类型。如果是“/”表示任意类型,如果是指定的类型,则会变成“type/”。

Accept-Language:使用的语言种类。

Accept-Encording:页面编码种类。

Accept-Charset:页面字符集。例如常说的unicode,UTF-8,ANSI,BIG5和GB2312都是编码。

User-Agent:提供了客户端浏览器的类型和版本与操作系统版本。

Host:连接的目标主机,如果连接的服务器是非标准端口,在这里会出现使用的非标准端口。

Connection:对于HTTP连接的处理,keep-alive表示保持连接,如果是在响应报文中发送页面完毕就会关闭连接,状态变为close。

Content-Length:发送给HTTP服务器数据的长度。即请求消息正文的长度;

x-forward-for:简称XFF头,代表客户端真实IP,通过修改该值,可以进行伪造客户端IP。XFF注入是SWL注入的一种。

2.2其中涉及到请求方法:

1.GET

get方法请求指定的页面信息,返回实体主体。该请求是向服务器请求信息,请求参数会跟在url后面,因此,对传参长度有限制的,而且不同浏览器的上限是不同的(2k, 7~8k及其他)。由于get请求直接将参数暴露在url中,因此对于一些带有重要信息的请求可能并不完全合适(不安全)。

2.POST

post请求是向指定资源提交数据进行处理请求,例如提交表单或者上传文件等。数据被包含在请求体中,POST请求可能会导致新的资源的建立和/或已有资源的修改。post方法没有对传递资源的大小进行限制,往往是取决于服务器端的接受能力,而且,该方法传参安全性稍高些

3.PUT

PUT方法是从客户端向服务器传送的数据取代指定的文档的内容。PUT方法的本质是idempotent的方法,通过服务是否是idempotent来判断用PUT 还是 POST更合理,通常情况下这两种方法并没有刻意区分,根据语义使用即可

4.DELETE

请求服务器删除指定的页面,DELETE请求一般会返回3种状态码:

200 (OK) - 删除成功,同时返回已经删除的资源

202 (Accepted) - 删除请求已经接受,但没有被立即执行(资源也许已经被转移到了待删除区域)

204 (No Content) - 删除请求已经被执行,但是没有返回资源(也许是请求删除不存在的资源造成的)

5.OPTIONS

允许客户端查看服务器的性能。(常见的是跨域预检Preflighted Reqeusts方法会采用该方法)。一般来说,开发中用到该方法是用来获取服务器支持的请求类型或者查看服务器类型,来确保接下来发送的请求够安全。该请求方法的响应不能缓存。如果该URI是一个星号(“*”),OPTIONS请求将试图应用于服务器,而不是某个指定资源;如果该URI不是星号,则只能用来获取该资源通信中可用的选项。

6.HEAD

类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

7.CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

8.TRACE

回显服务器收到的请求,主要用于测试或诊断。


三、响应报文(response)

当收到get或post等方法发来的请求后,服务器就要对报文进行响应。同样,响应报文也分为两部分。以下为抓包截图:


3.1注释:

字段名意义

响应码/状态码:响应代码是服务器根据请求进行查找后得到的结果的一种反馈,有1xx 2xx 3xx 4xx 5xx

server:服务器软件版本信息--即中间件。

date:标注了当前服务器的时间。

connection:标明连接关闭,抓包可以发现在响应返回后服务器向客户端发出fin包单向关闭了连接。

Expires:表示在某个时间以前可以不用重新缓存该页面

cache-control:表示对页面是否进行缓存。

content-type:表示了应答请求后返回的内容类型。Content还有内容长度和内容语言以及内容编码三个内容,其中内容长度只有在请求报文中的connection值为keep-alive时才会用到。

Cookiecookie:是一种类似缓存的机制,它保存在一个本地的文本文件中,其主要作用是在发送请求时将cookie放在请求首部中发送给服务器,服务器收到cookie后查找自己已有的cookie信息,确定客户端的身份,然后返回相应的页面,cookie的方便之处在于可以保持一种已登录的状态。

set-cookie:给出了cookie的id,过期时间以及参数path,path是表示在哪个虚拟目录路径下的页面可以读取使用该cookie。如果用户在连接中通过了服务器相应的认证程序,服务器会添加一个cdb_auth到set-cookie中,这个段表示了客户端的认证信息。

Refresh:服务器通过Refresh头告诉浏览器定时刷新浏览器。

其他为响应信息

3.2其中涉及到状态码:

1**:表示接收到请求,继续进程,在发送post后可以收到该应答。

2**:表示请求的操作成功,在发送get后返回。常见200

3**:表示重发,为了完成操作必须进一步动作。

4**:表示客户端出现错误。

5**:表示服务器出现错误。

200 OK      //客户端请求成功

400 Bad Request  //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden  //服务器收到请求,但是拒绝提供服务

404 Not Found  //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容