Http 协议小结

1. 请求行,状态行只有一行

2. 消息头由只有一个部分

3. 消息头与实体之间通过空行隔开(\r\n)

4. 可以存在多个实体部分,实体之间通过空行分开(在Content-type: multipart/form-data的类型当中)

5.连续两个\r\n只是一个部分的分隔符

6. 消息头,实体头的格式

1. xxxx:<空格> yyy,uuu <\r><\n>

如Accept:  text/html,image/*

2.xxxx:<空格>yyy;aa= <空格> bbb<\r><\n>

Content-Dispostion: attachment; filename=aa.zip

3.xxxx: 空格 ccc=zzz; <空格>ii= ooo <\r><\n>

Cookie:  uuid_t=9988778; un=px348402717

 

7. 在请求当中传递自定字段的方式

1. 在消息头当中

2. 在form表单当中,method=get时,存放在url ? xxx=ddd&ss=ww

3. 在form表单当中,method=post时,且消息头的Content-type:multipar/form-data存放在实体头当中,

Content-Dispostion:form-data;name=”user”

4.在form表单当中,method=post时,且消息头的Content-type:application/x-www-form-urlencoded

在实体当中的格式

para1=abc&param2=xxxy

 

8. Web 服务器与Socket之间的关系

1. accept 循环

server对于connection不需要专门的维护与管理,使用玩就可以关闭

2. connection循环

  socket –> buffer –> serialization->bussiness

bussiness其是直接使用utf-8编码,没有使用类似 google protobuf.这样在解码编码的时候会简单一些。推论:不是字符串就是二进制数据,这样方便处理,如表单上传文件,客户端先完整发送表单,然后再写入二进制数据,服务器在解析时候,根据写入数据的顺序,以\r\n做为TCP分包的标识。

依次解析请求行,消息头,这些是byte 直接按utf-8转换成字符串,然后根据Content-type,Content-length,Transfer-Encoding等之类来读取实体数据。

核心: 以纯二进制流的概念来读取数据,读取缓存当中,然后\r\n分包,转换成字符串,再根据情况判断客户端发送数据的方式,以对应的方式接收数据。

这样就很好支持,一会写入消息头之类的字符串数据,一会写入文件之的二进制数据。我们均将其以byte处理。且因为client在connection上是按请求响应这样的流程写入数据,不会在流程当中写入其他的,或重复消息头数据。

发布了33 篇原创文章 · 获赞 3 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章