Tcp/ip的握手和揮手不須要咱們去處理,由於咱們進行網絡編程是使用socket套接字,而socket已經處理好了這些操做。可是咱們仍是要學習tcp/ip的原理,畢竟技多不壓身,多學點東西老是好的。本文中做者將從問題入手介紹一下網絡編程中的基礎知識,包括三次握手、四次揮手、http請求相關內容、socket基礎知識等,但願能對你們有所幫助。
html
1.TCP創建鏈接爲何要三次握手編程
TCP創建鏈接時三次握手是爲了保證客戶端和服務端的讀寫功能都正常,第一次握手由客戶端發起,服務端接收到了之後就能夠證實客戶端的發送功能正常。第二次握手服務端回信,告知客戶端接收到了,此舉能夠證實服務端的接收功能都正常。可是服務端並不知道客戶端是否能讀,因此須要進行第三次握手,客戶端告知服務端其發送的數據已接收,至此便成功保證了客戶端和服務端均能讀能寫。瀏覽器
接下來咱們經過抓包工具實際來查看一下整個三次握手過程,這裏須要用到wireshark抓包工具,由於charles、fiddler上面抓包看不到這麼詳細的數據包信息。咱們打開wireshark,而後發送一條http請求。能夠看到,本機向服務端發送了序列號爲0的數據,服務端給本機發送了一條響應號Ack爲1(序列號+1)的數據,客戶端收到之後發送一條序列號爲1(第二次發送序列號要+1)、響應號爲1的數據(服務端發送的序列號+1)。總結一下,至關於每次後者響應值是前者的序列號+1,用來證實數據獲取正確。
安全
2.TCP斷開鏈接爲何要四次揮手網絡
當客戶端和服務端數據交互結束時,不能一直保持在連線狀態,須要將鏈接斷開。這裏既有多是客戶端提出斷開也有多是服務端提出,本次就以客戶端提出爲例來講。socket
揮手的過程和握手很相似。當客戶端發起斷開鏈接的請求FIN,即第一次揮手,表明客戶端不會再發送其餘數據給服務端,服務端會當即返回一個響應值爲ack=seq+1的數據,可是這並不表明服務端真正關閉鏈接的,由於有可能服務端還有向客戶端發送的數據還並無傳輸完,因此要等傳輸完之後再發送一個新的序列號爲y的數據包給客戶端,客戶端接收到了這個新包之後繼續發送一個響應值爲y+1的包給服務端,當服務端接收到該包之後雙方纔會真正關閉鏈接。這就是創建鏈接須要3次,可是揮手就要進行四次握手的緣由。
tcp
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源碼閱讀解析等等很是多。活到老學到老,只有學習纔是通往優秀碼農的惟一途徑,等後面有空再繼續更新。