HTTP协议——具体解析

之前介绍过http的基础知识,这章来继续探讨一下具体组成。为之后自己写web服务器打个基础。

简介

超文本传输协议,具体的看我之前的博客:HTTP协议
HTTP通常是作为应用层的协议。HTTP协议承载于TCP协议之上,有时候也承载在TLS/SSL协议层之上(HTTPS)。
网络层协议

工作流程

回顾一下工作流程:

  1. 客户端连接到web服务器:客户端与服务器的http端口建立TCP连接。
  2. 客户端请求:通过TCP套接字,客户端向服务器发送请求报文-请求行、请求头部、空行和请求数据组成。
  3. 服务器接收并响应:服务器解析请求,将资源副本写到套接字,由客户端读取。
  4. 释放TCP连接:连接状态为关闭时,服务器主动关闭连接,客户端被动。若为keepalive,则保持一段时间,等待新的请求。
  5. 客户端解析内容:解析状态行看是否成功,然后解析响应头分析出内容。再读取数据HTML,翻译并显示。

请求消息-Request

客户端发送一个HTTP请求到服务器的请求消息格式:
请求行、请求头部、空行和请求数据
下面是一个GET请求的例子:我从百度搜索一个图片

  1. GET /pv/pv2.gif?ie=utf-8&q=haha&userid=&samplekey=&event_type=pv&tn=result&tpl=&fr=ala&258779243144.4575 HTTP/1.1

  2. Host: image.baidu.com
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36
    Accept: image/webp,image/apng,image/,/*;q=0.8
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: no-cors
    Sec-Fetch-Dest: image
    Referer: https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=haha&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9

  3. (空行)

  4. (任意其他数据)

从上面这个例子来看,1234部分。
1为请求行,说明请求类型,要访问的资源以及所使用的HTTP版本。
GET 表明请求类型,/后东西为所请求的资源,HTTP1.1,为使用版本
2为请求头部,请求行之下的开始,说明服务器要使用的额外信息。
HOST为请求目的地,connection为连接信息,user-agent是使用的工具,是浏览器检测正常连接还是爬虫的东西,具体的可以自己详查,知道这个东西就可以了。可以看到是一些自己的电脑和浏览器信息。之后就是一些相关的东西,需要时详查即可。
3为空行,请求头部后的行必须是空行。
4为请求数据,可以添加一些其他的信息,我们这个里面为空。

post请求格式大致类似。
在这里插入图片描述

Response

服务器接受到客户端的请求后会返回一个HTTP的响应消息。
响应也是四部分组成:状态行、消息报头、空行和响应正文。
在这里插入图片描述
状态行,由HTTP协议版本号,状态码,状态消息三部分组成。HTTP1.1为版本号,200为状态码,消息是OK。
消息报头,说明一些复杂信息。date不必说,时间。content-type:指定HTML,编码类型之类的。
空行,同get。
响应正文:服务器返回给客户端的文本信息。其后的内容。

HTTP状态码

状态码由三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息,请求已收到,继续处理。
2xx:成功,请求被成功接收、理解、接受。
3xx:重定向,完成请求需要进一步的操作。
4xx:客户端错误,请求无法实现。
5xx:服务端错误。
常见状态码
200 ok:请求成功
400 bad request:请求有语法错误,服务器无法理解
401 unauthorized:请求未经授权
403 forbidden:被服务器拒绝
404 not found:我经常会遇到的,请求资源不存在
500 internal server error:服务器发生不可预期的错误

GET&POST

这是两个常用的请求,单独拿出来说一下:

  1. GET提交的数据会放在URL之后,以?分割,参数间以&相连。POST请求是把提交的数据放在HTTP包的body中。
  2. GET提交的数据大小有限制(其实限制于URL),POST没有。
  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
  4. GET提交数据会有安全问题,因为在url中。
  5. 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

好了,大概就是这些了,具体使用的时候再深挖。HTTP不是一个很难的东西,看起来就像是个字符串解析。懂语法懂规则,操作起来就不会很复杂。
加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值