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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章