概述
我们都知道现在大部分的B/S 系统。其核心的通讯协议还是 TCP/IP 协议,应用层的话就是HTTP 协议,我们最常的打交到的就是HTTP协议了。所以了解HTTP协议的相关知识显得尤为重要。
HTTP请求报文
一个HTTP请求报文由请求行(request line)+ 请求头部(head)+请求体 3个部分组成。格式如下:
<request-line> <headers> <request-body>
其中请求头部由 关键字/值对组成,每行一对,关键字和值用英文冒号“:” 分隔。
常用的请求头有:
1User-Agent :产生请求的浏览器类型 例如:User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
2.Accept:客户端可识别的内容类型列表。例如:Accept: application/json, text/javascript, /; q=0.01
3.Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。例如:www.baidu.com
4.Cookie: 客户端的Cookie就是通过这个报文头属性传给服务端,通过sessionId 可以知道同一个会话
Cache-Control :对缓存进行控制 例如: Cache-Control :no-cache
5.Referer : 用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着HTTP来源地址,目前的网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。
HTTP 响应报文
与请求报文类似,HTTP 响应报文也由三个部分组成,分别是:状态行、消息报头、响应正文。格式如下:
<status-line> <headers> <response-body>
HTTP 响应头
响应头部也是由 关键字/值对组成,每行一对,关键字和值用英文冒号“:” 分隔。常用的响应头有:
1.Server : 使用服务器名称,如Server:Apache/1.3.6(Unix)
2,Content-Type: 用于指明发送给接收者的实体正文的媒体类型,如Context-Type: application/json;charset=UTF-8
3.Content-Encoding: 与请求报文Accept-Encoding对应,告诉浏览器服务端采用的什么压缩编码
4.Content-Language : 描述了资源所用的自然语言,与Apache-Language 对应
5.Content-Length: 指明实体正文的长度,用以字节方式存储的十进制数字来表示
6.Keep-Alive : 保持连接的时间:如 Keep-Alive: timeout=5,max=20
说完了,响应头,我们还需要重点关注下常见的状态码。HTTP状态码有很多,我们经常会碰到的状态码有如下几个:
HTTP状态码
1.200 表示客户端请求成功
2.302 表示临时跳转,跳转的地址通过Location指定
3.400 表示客户端请求有语法错误,不能被服务器识别
4.403 表示服务器收到请求,但是拒绝提供服务
5.404 表示请求的资源不存在
6.500 表示服务器发生不可预期的错误
说完了HTTP请求报文和响应报文的相关知识,接下来我们来看看,HTTP的请求方法
HTTP的请求方法
HTTP 1.1 中请求方法有GET,POST,PUT,DELETE,HEAD。其中最常用到的就是GET方法和POST 方法了。
GET请求
1.GET请求,请求数据会直接附在URL之后(就是把数据防止在HTTP协议头
<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表ASCII。
虽然HHTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度
进行限制,而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制,例如:IE对URL长度的限制是2083字节(2K+53)(对应231个中文字符),chrome 的长度限制超过8182个字符(对应909个中文字符)返回414的错误。
2. GET 请求,请求数据直接以明文出现在URL中,对于一下私密数据(账号和密码),非常不安全。
POST 请求
1.POST 请求是把提交的数据放置在HTTP请求报文的请求体<request-body>中,理论上传输数据不受限。POST请求,地址栏不会改变。
2. POST 请求,请求数据是放在<request-body>中,相对GET请求安全一些。
DNS 解析过程
DNS的作用
DNS就是将域名解析成IP地址
DNS解析过程
如上图所示:DNS的解析过程主要有十步:
1.浏览器检查缓存中有没有这个域名对应的解析过的IP地址,如果有的话解析过程就结束,缓存时间由TTL属性来设置
2.如果用户浏览器缓存没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果,其实操作系统中也会有一个域名解析的过程。在Windows中可以通过 C:\Windows\System32\drivers\etc\hosts文件来设置。在Linux中这个配置文件是/etc/hosts
3.在用户电脑中的网络配置中都会有“DNS服务器地址”用于配置域名服务器。称为LDNS
在Windows 中通过 ipconfig 查询这个地址,在Linux中通过 cat /etc/resolve.conf 查看
4.如果LDNS 仍然没有命中,就直接到Root Server域名服务器请求解析。
5.根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址,
gTLD是国际顶级域名服务器,如:.com、.cn、.org等
6.本地域名服务器(Local DNS Server)再向上一步gTLD服务器发送请求
7.接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器地址。这个
Name Server通常就是你注册的域名服务器。
8.Name Server域名服务器会查询存储的域名和IP的映射关系表。在正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server 域名服务器
9.返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制
10.把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
总结
本文简单的介绍了HTTP的相关基础知识,包括请求报文,响应报文,以及其请求头和响应头常用的属性。然后,重点介绍了GET请求和POST请求。最后介绍了DNS的解析过程。