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¶m2=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上是按请求响应这样的流程写入数据,不会在流程当中写入其他的,或重复消息头数据。