今天看了看http协议;写一下收获吧。
http(Hyper Text Transfer Protocol)超文本传输协议;超文本?好像在哪里听说过,html(HyperText Markup Language)超文本标记语言,他们之间是不是有什么关系呢;
http协议是一个应用层的协议;它是基于tcp/ip进行通信的;其实就是一个通过tcp来传输数据的协议,传输的数据为html,图片,文件,查询结果等;实现了客户端(浏览器)与服务器之间的通信。
那浏览器是怎么样告诉服务器是要传输什么数据的呢?这就需要url;
uri:(Uniform Resource Identifiers, URI)统一资源标识符,而url是一种特殊的uri,它可以告诉服务器浏览器需要什么信息;
url:(UniformResourceLocator)统一资源定位符,可以用来标识某一处资源在网络上的地址;比如下面这个就是一个url,不过它是https协议的这个先不管它;
https://blog.csdn.net:443/valada/article/details/79909851
分析一下这个url,blog.csdn.net是一个域名,dns服务器可以把这个域名解析成一个IP地址,所以它实际上就是一个IP地址,然后冒号后面的443表示一个端口号,因为是https协议所以默认的端口号是443,http协议是80端口,其实服务器可以把它想成就是一台主机,这个主机的ip地址为前面域名所解析出来的IP地址,端口号也知道了,自然就可以在浏览器和服务器之间建立tcp套接字连接,“/” 符号后面的就表示所要请求的内容在服务器上的逻辑位置了。
下面就容易理解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的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;
请求消息 request:
请求行 /r /n
请求头部 /r /n
请求数据 /r /n
wireshark抓取的http request:
注意 host之后的/r /n后下一行还是/r/n这是空行 是必须的;
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
post说明请求类型为post,/a为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
关于http协议的版本:
http1.0: 当前浏览器客户端与服务器建立连接后,只能发送一次请求,
一次请求之后连接关闭
http1.1:当前浏览器客户端和服务器建立连接之后,可以在一次连接中发送多次请求。(基本上都使用1.1版本)
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,可以添加任意的其他数据。
常见请求方式:GET和POST
1)GET方式提交
a)地址栏(url)会跟上参数数据。以?开头,多个参数以&分割
GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1
b)GET提交参数数据有限制,不超过1kb
c)GET方式不适合提交敏感密码。
d)注意:浏览器直接访问的请求,默认提交方式是GET方式。
2)POST方式提交
a)参数不会跟在URI后面。参数而是跟在请求的实体内容中。没有?开头,而是以&连接
name=eric&password=123456
b)post提交的参数数据没有限制。
c)post方式提交铭感数据
关于请求头部:
Accept: text/html,image/* -- 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 -- 浏览器接受的编码格式
Accept-Encoding: gzip,compress --浏览器接受的数据压缩格式
Accept-Language: en-us,zh- --浏览器接受的语言
Host: www.it315.org:80 --(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器最后的缓存时间
Referer: http://www.it315.org/index.jsp -- 当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器类型
Cookie:name=eric -- 浏览器保存的cookie信息
Connection: close/Keep-Alive -- 浏览器跟服务器连接状态。close: 连接关闭 keep-alive:保存连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 请求发出的时间
http响应消息 response:
响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
用wireshark抓取response:
注意空行;
关于状态码:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
302 //请求重定向
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常