应用层HTTP协议----超文本传输协议

HTTP是一个属于应用层的协议,它是基于TCP实现的服务器/客户端的模式,客户端发送请求,服务请响应请求.

认识URL

URL:网址.
例如:下面这个图中的网址其实是一个完整的的网址
应用层HTTP协议----超文本传输协议_第1张图片
而我们现在的看到的网址基本都是这样的:

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协议----超文本传输协议_第2张图片

HTTP协议格式

我们可以通过Fiddler抓包工具进行抓包.来查看http协议的相关信息.
例如:
GET方法:(一种HTTP的请求)
应用层HTTP协议----超文本传输协议_第3张图片
POST方法(一种HTTP的请求)
应用层HTTP协议----超文本传输协议_第4张图片
HTTP的响应
应用层HTTP协议----超文本传输协议_第5张图片
问题: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的服务器的实现代码,若需要请戳

你可能感兴趣的:(Linux)