Tcp/ip的握手和揮手不需要我們去處理,因為我們進行網路程式設計是使用socket套接字,而socket已經處理好了這些操作。但是我們還是要學習tcp/ip的原理,畢竟技多不壓身,多學點東西總是好的。本文中作者將從問題入手介紹一下網路程式設計中的基礎知識,包括三次握手、四次揮手、http請求相關內容、socket基礎知識等,希望能對大家有所幫助。
1.TCP建立連線為什麼要三次握手
TCP建立連線時三次握手是為了保證客戶端和服務端的讀寫功能都正常,第一次握手由客戶端發起,服務端接收到了以後就可以證明客戶端的傳送功能正常。第二次握手服務端回信,告知客戶端接收到了,此舉可以證明服務端的接收功能都正常。但是服務端並不知道客戶端是否能讀,所以需要進行第三次握手,客戶端告知服務端其傳送的資料已接收,至此便成功保證了客戶端和服務端均能讀能寫。
接下來我們通過抓包工具實際來檢視一下整個三次握手過程,這裡需要用到wireshark抓包工具,因為charles、fiddler上面抓包看不到這麼詳細的資料包資訊。我們開啟wireshark,然後傳送一條http請求。可以看到,本機向服務端傳送了序列號為0的資料,服務端給本機傳送了一條響應號Ack為1(序列號+1)的資料,客戶端收到以後傳送一條序列號為1(第二次傳送序列號要+1)、響應號為1的資料(服務端傳送的序列號+1)。總結一下,相當於每次後者響應值是前者的序列號+1,用來證明資料獲取正確。
2.TCP斷開連線為什麼要四次揮手
當客戶端和服務端資料互動結束時,不能一直保持在連線狀態,需要將連線斷開。這裡既有可能是客戶端提出斷開也有可能是服務端提出,本次就以客戶端提出為例來說。
揮手的過程和握手很類似。當客戶端發起斷開連線的請求FIN,即第一次揮手,代表客戶端不會再傳送其他資料給服務端,服務端會立即返回一個響應值為ack=seq+1的資料,但是這並不代表服務端真正關閉連線的,因為有可能服務端還有向客戶端傳送的資料還並沒有傳輸完,所以要等傳輸完以後再傳送一個新的序列號為y的資料包給客戶端,客戶端接收到了這個新包以後繼續傳送一個響應值為y+1的包給服務端,當服務端接收到該包以後雙方才會真正關閉連線。這就是建立連線需要3次,但是揮手就要進行四次握手的原因。
3.Http的各版本功能
在http0.9中只支援get命令,並且服務端只能返回html格式字串,傳送完就關閉tcp連線
在http1.0中可以傳送任何格式內容,也支援更多請求方式,還可以加入頭資訊
在http1.1中引入持久連線,一次握手可以傳送多個請求,當然雙方也可以在請求頭中設定connection close來關閉持久連線。這是目前使用最多的http版本。
SPDY協議由谷歌提出,必須使用https,已經被淘汰了
在http2.0中所有的response資料都變成了二進位制格式,所以可讀性差,但是解析更高效。同時http2.0支援了服務端主動推送資料到客戶端。
4.Http報文格式
http報文分為請求行、請求頭、請求資料,在以下的例子中第一行是請求行,給了一個host請求頭,最後得到了請求資料,其中包括響應頭和響應資料。
5.響應狀態碼
請求以後響應碼有很多,其中2xx代表請求成功。數量太多,就不一一說明,下面列舉出一部分,不在其中的需要另外去找相關資料。
6.請求頭有哪些
請求頭的數量也很多,這裡舉兩個例子,就不一一闡述了。
Connection:當不需要建立長連線,介面請求完就關閉連線時將Connection設為close
Range:斷點續傳時使用
7.響應頭有哪些
和請求頭類似,響應頭也有很多種,這裡也舉個例子,就不一一闡述了。
Content-Type:返回內容的型別,告知客戶端本次獲取的資料是什麼型別的
8.如何用jdk自帶的socket完成http請求
其實就是拼接出來請求內容,然後寫入連線好服務端的socket中,這裡HttpCodec只是為了將資料列印出來而封裝的一個工具類,具體程式碼如下:
9.如何用jdk自帶的socket傳送HTTPS請求
HTTP在傳輸資料時,所有傳輸的內容都是明文,無法保證資料的安全性。(賬號、密碼、個人資訊等隱私)
網景在1994年建立了HTTPS,HTTPS就是安全版的HTTP。
需要注意的是,如果使用的證書沒有經過認證,即服務端所用的證書不在裝置的信任證書列表中,該列表可以在瀏覽器的選項-安全中檢視,手機上可以通過設定-證書檢視。若使用的證書不被裝置信任,則發起該https介面請求時需要傳入該證書到socket中,具體方法如下:
總結:今天分享了三次握手、四次揮手的功能以及實現方式,然後介紹了http的發展歷程以及各版本區別,接下來介紹了請求頭和響應頭的種類,最後利用socket發起了一次最簡單的http和https請求。但是網路程式設計的知識遠遠不止如此,還有很多的東西需要學習,比如更復雜的請求、長連線優化、OKHTTP原始碼閱讀解析等等非常多。活到老學到老,只有學習才是通往優秀碼農的唯一途徑,等後面有空再繼續更新。