TCP/IP 是一個四層體系結構,它包含:應用層,運輸層,網際層和網絡接口層。
應用層:通過應用進程間的交互來完成特定網絡進程的應用。應用層協議定義的是應用進程間的通信和交互規則。
運輸層:負責向兩台主機進程之間的通信提供通用的數據傳輸服務。應用進程利用該服務傳送應用層報文。
網絡層:選擇合適的網間路由和交換節點,確保計算機通信的數據及時傳送。
數據鏈路層:兩台主機之間傳輸數據,總是在一段一段的鏈路上傳送,需要使用專門的鏈路層協議。
物理層:實現相鄰計算機節點之間比特流的透明傳送,儘可能屏蔽掉具體傳輸介質和物理設備的差異。
什麼是TCP?
TCP其實一種面向連接的、可靠的、基於字節流的傳輸層通信協議,在發送數據前雙方必須建立一種連接。所謂連接就是服務端和客户端保存的關於對方的一份信息,包含IP地址或者端口號等。
一個TCP連接由一個4元組構成,分別是兩個IP地址和兩個端口號。一個TCP連接通常分為三個階段:連接、數據傳輸、退出(關閉)。通過三次握手建立一個鏈接,通過四次揮手來關閉一個連接。
三次握手:三次握手的本質是確認通信雙方收發數據的能力。
第一次握手:客户端要向服務端發起連接請求,首先客户端隨機生成一個起始序列號ISN(比如是100),那客户端向服務端發送的報文段包含SYN標誌位(也就是SYN=1),序列號seq=100。
第二次握手:服務端收到客户端發過來的報文後,發現SYN=1,知道這是一個連接請求,於是將客户端的起始序列號100存起來,並且隨機生成一個服務端的起始序列號(比如是300)。然後給客户端回覆一段報文,回覆報文包含SYN和ACK標誌(也就是SYN=1,ACK=1)、序列號seq=300、確認號ack=101(客户端發過來的序列號+1)。
第三次握手:客户端收到服務端的回覆後發現ACK=1並且ack=101,於是知道服務端已經收到了序列號為100的那段報文;同時發現SYN=1,知道了服務端同意了這次連接,於是就將服務端的序列號300給存下來。然後客户端再回復一段報文給服務端,報文包含ACK標誌位(ACK=1)、ack=301(服務端序列號+1)、seq=101(第一次握手時發送報文是佔據一個序列號的,所以這次seq就從101開始,需要注意的是不攜帶數據的ACK報文是不佔據序列號的,所以後面第一次正式發送數據時seq還是101)。當服務端收到報文後發現ACK=1並且ack=301,就知道客户端收到序列號為300的報文了,就這樣客户端和服務端通過TCP建立了連接。
簡而言之,三次握手:
1.客户端向服務器發送一個建立連接的請求
2.服務器接到請求後發送同意連接的信號
3.客户端接到同意連接的信號後,再次向服務器發送了確認信號,然後客户端與服務器的連接建立成功
四次揮手:目的是關閉一個鏈接
第一次揮手:當客户端的數據都傳輸完成後,客户端向服務端發出連接釋放報文。
第二次揮手:服務端收到客户端發的FIN報文後給客户端回覆確認報文。
第三次揮手:服務端將最後數據(比如50個字節)發送完畢後就向客户端發出連接釋放報文。
第四次揮手:客户端收到服務端發的FIN報文後,向服務端發出確認報文。而服務端一旦收到客户端發出的確認報文就會立馬釋放TCP連接,所以服務端結束TCP連接的時間要比客户端早一些。