http拨测是什么意思_从零开始:编写一个Web服务器---2.HTTP部分的实现

297d0a467cbeacd251e5c852225a50d6.png
在看完Linux网络编程之后,突然想做一个有挑战性的项目,实现一个高性能的Web服务器。于是我萌生了一边自己学着写服务器,一边详细的(手把手的那种)出一个Web服务器的整体流程。
这部分详细讲解HTTP部分的实现
代码参考GitHub,会不断更新参考代码,并给出链接

HTTP---Hyper Text Transfer Protocol(超文本传输协议)

c4bc3e3f7f524beaecba630ccccc82d6.png

在http协议是有请求的,而TCP建立连接并不是称之为“请求”。

那么意味着,需要在本地浏览器上发送一定的“请求信息”给服务器,服务器的作用就是解析这样的请求,而本地客户端则是填写字段(不同功能)即可。

(简单来说就是协议规定了什么“字段”表示什么意思,服务器的任务就是解析出客户端所表达的意思即可)

Server端

那么,代码部分在服务器端,就需要完成:

  1. 对于char*[]的解析
  2. 不同功能字段的判断
  3. 空格问题
  4. 如何按行读取
  5. 判断资源是否存在,如果存在,判断这个资源是一个目录、普通文件还是一个可执行程序

这里默认你对socket有一定了解,知道一些基本IO知识。

//以下便是浏览器给服务器发送的Http请求,后续主要是处理这个头

//
// GET / HTTP/1.1
// Host: 192.168.0.23:47310
// Connection: keep-alive
// Upgrade-Insecure-Requests: 1
// User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
// Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*; q = 0.8
// Accept - Encoding: gzip, deflate, sdch
// Accept - Language : zh - CN, zh; q = 0.8
// Cookie: __guid = 179317988.1576506943281708800.1510107225903.8862; monitor_count = 5
//

// POST / color1.cgi HTTP / 1.1
// Host: 192.168.0.23 : 47310
// Connection : keep - alive
// Content - Length : 10
// Cache - Control : max - age = 0
// Origin : http ://192.168.0.23:40786
// Upgrade - Insecure - Requests : 1
// User - Agent : Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 55.0.2883.87 Safari / 537.36
// Content - Type : application / x - www - form - urlencoded
// Accept : text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, */*;q=0.8
// Referer: http://192.168.0.23:47310/
// Accept-Encoding: gzip, deflate
// Accept-Language: zh-CN,zh;q=0.8
// Cookie: __guid=179317988.1576506943281708800.1510107225903.8862; monitor_count=281
// Form Data
// color=gray

#接下来对这些信息进行解析:  
第一部分:请求头行,包含请求类型、URI、HTTP协议版本;
请求信息类型通常有:get、post、put等等;  
第二部分:即紧跟第一行之后的,请求头部,包含服务器所使用的说明信息;
接下来解释一下这些说明信息的意思:
1、host:请求web服务器的域名地址
2、Connection: 表示是否持久连接;即keep-alive表示持久连接;
3、Cache-Control:指定请求和响应的缓存机制;no-cache(不能缓存)、no-store(在请求消息中发送将使得请求和响应消息都不使用缓存)、  max-age(客户机可以接收生存期不大于指定时间(以秒为单位)的响应)、max-stale(客户机可以接收超出超时期间的响应消息)、min-fresh(客户机可以接收响应时间小于当前时间加上指定时间的响应)、  only-if-cached等等
4、User-Agent: HTTP协议运行的浏览器类型的详细信息;比如:谷歌/67.0.3396.995、Accept: 指浏览器可以接收的内容类型;
6、Accept-Encoding: 客户端浏览器可以支持的web服务器返回内容压缩编码类型;
7、Accept-Language:浏览器支持的语言类型,
8、Cookie: 某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密);例如当我们上网时,某些网站能准确的推送我们想要的信息。  
第三部分:"rn" --> 分割header和body部分的分界线

Client端

# 响应消息

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0x8bda58760001baca
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+10412ee70bbb9e9eec33f3dbcb3e2df7
Date: Wed, 18 Jul 2018 03:26:13 GMT
Expires: Wed, 18 Jul 2018 03:25:42 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1435_21118_20929; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

# 响应消息的解析:  
第一部分:响应头,包含:HTTP协议版本、状态码(1XX-告知请求处理进度和情况,2XX-成功,3XX-表示需要进一步操作,4XX-客户端错误;5XX-服务器错误;)  
第二部分:响应头部,包含服务器发送的附加信息;这里针对几个重要的进行解析说明:  https://www.cnblogs.com/mylanguage/p/5689879.html -->有详细说明。  
第三部分:"rn" --分割header和body的分割线  第四部分:包含服务器向客户端发送的数据。

那么,Server端的解析代码可以搬给Client端用嘛,当然可以,不过肯定需要做一些小小的改动

Server端的Http部分代码实现

参考代码来自 EZLippi/Tinyhttpd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值