HTTP是一个属于应用层的协议,它是基于TCP实现的服务器/客户端的模式,客户端发送请求,服务请响应请求.
认识URL
URL:网址.
例如:下面这个图中的网址其实是一个完整的的网址
而我们现在的看到的网址基本都是这样的:
https://www.baidu.com/s?wd=%E5%A4%A7%E8%92%9C%E7%9A%84%E8%8B%B1%E6%96%87&rsv_spt=1&rsv_iqid=0xea8fc8ac00048646&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsp=3&rsv_sug9=es_2_1&rsv_sug4=3672&rsv_sug=9
https是http的加密协议.
%E5%A4%A7%E8%92%9C%E7%9A%84%E8%8B%B1%E6%96%87:这是通过urlencode生成的.可以使用urlencode与urldecode来进行生成和解码.目的是为了防止出现特殊符号,如果搜索中出现了特殊字符,就会通过urlencode进行转义为16进制,并且可以通过urldecode进行解码.
HTTP协议格式
我们可以通过Fiddler抓包工具进行抓包.来查看http协议的相关信息.
例如:
GET方法:(一种HTTP的请求)
POST方法(一种HTTP的请求)
HTTP的响应
问题:GET 方法与POST方法的区别?
GET方法中没有body,而POST方法中有body.用Content-Length表示body的总字节数.
总结:
HTTP协议的请求格式:(首行 + header + 空格 + Body)
- 首行:[方法] + [URL] + [版本]
- Header:请求的属性,由键值对组成,键值对以冒号加空格作为分割;每组属性使用’\n’分割,遇到空行表示header的结束.
- Body:空行后面的都是Body,Body可以为空字符串.如果存在Body,那么Header部分就会有一个Content-Length属性来标识Body的长度以及Content-Type标识Body的类型.
HTTP的响应格式:(与请求格式相同)
- 首行:[版本号] + [状态码] + [状态码解释]
- Header:与请求的格式相同.
- Body:长度和文本格式就是请求中的标识.
HTTP中header中常见的
header | 解释 |
---|---|
Content-Type | Body部分的文本格式(text/html等) |
Content-Length | Body的长度 |
Host | 客户端告诉服务器,所请求的资源是在哪个主机的哪个端口上 |
User-Agent | 说明用户的操作系统和浏览器的版本信息 |
referer | 当前页面从哪个页面跳转过来的,比如:统计广告的来源 |
location | 告诉客户端接下来去哪里访问 |
Cookie | 在客户端存储的信息,保存在本地的文件,比如存储着用户的登录信息. |
Set_Cookie | 与Cookie是对应的,是服务器给客户端响应中的信息,比如:会将客户端的登录信息进行响应给客户端,客户端会将信息保存在Cookie文件中,那么当客户端再次访问该网页时,就不需要再次输出用户和密码等,而是可以直接登录. |
HTTP的状态码
- | 类别 | 原因 |
---|---|---|
1XX | Infornation(信息行状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器请求出错 |
最常见的状态码:
- 202:表示OK
- 404:表示Not Found
- 403:表示禁止访问(Forbidden)
- 302:表示重定向
- 504:表示网关超时(Gateway Timeout)
- 502:表示错误的网关(Bad Gateway)
- 418:是一个彩蛋:”I’m a teapot.”
那么,了解了HTTP的响应格式以及请求格式,那么就可以实现一个简单的HTTP服务器了.
简单的HTTP的服务器的实现代码,若需要请戳