計算機網絡的結構是分層的,每層都有各種協議來規范,關于互聯網的分層以及每一層的協議介紹請參考我的另外一篇文章:現代巴別塔(互聯網)是怎么建成的。而TCP/IP是其中最重要的一個協議族,除了包括位于傳輸層的TCP/UDP協議和網絡接口層的IP/ARP協議之外,默認還包括位于應用層的http/Ftp/Telnet等協議。
TCP
1. TCP協議的定義
TCP(Transmission Control Protocol)協議是構成整個互聯網傳輸協議的重要一部分,它位于網絡分層結構的傳輸層。
其實,傳輸層的協議有兩種:TCP和UDP。但是UDP不能保證數據被準確無誤的發送到目的地,而TCP要求目標主機在收到數據后發回一個確認,如果發送方在一定時間內未收到確認信息,則會重新發送數據包。因此,UDP發送速度更快,TCP發送更可靠。
2. TCP協議實現的步驟
2.1 知識儲備
標志位(SYN flag):
緊急指針(URGENT POINTER):立即處理不必排隊
確認(ACKNOWLEDGEMENT):ACK=1表示確認數據包成功接收
推送PUSH:關于優先級
復位(RST)標志
同步標志(SYNCHRONISATION FLAG):SYN=1表示申請建立連接
FIN 標志:拆除上一個標志SYN建立的連接
ack(acknowledge) number:只有ACK=1時才有效,建立連接后發送報文的ACK必須為1.
seq(sequence) number
MSL(Maximum segment lifetime):報文最大生存時間
2.2 三次握手
三次握手即客戶端與服務端傳送的三個數據包
- 第一次握手:
客戶端發送數據包到服務端,其中將標志位SYN置為1,發送順序號seq=x。然后客戶端進入SYN_SENT狀態,等待服務器確認
- 第二次握手:
服務端接收到數據包,根據標志位SYN=1知道客戶端請求建立連接。服務端發送確認數據包到客戶端,其中將標志位ACK,SYN置為1,ack=x+1,seq=y。然后服務器進入到SYN_RCVD狀態。
- 第三次握手:
客戶端接收到來自服務端的確認后,檢查ack是否為x+1,如果正確,則發送數據包到服務端,其中ack=y+1。服務端檢查ACK是否是y+1,如果正確,則連接建立成功,客戶端和服務端同時進入ESTABLISHED狀態,完成三次握手。
2.3 數據傳輸
客戶端序列號seq=x+1,ACK=Y+1,發送數據包給服務端,服務端收到后,ACK=y+2
2.4 四次揮手
- 第一次揮手:
客戶端發送一個數據包到服務器,其中標志位FIN=1,初始化序列號seq=u,同時客戶端進入FIN_WAIT_1狀態。
- 第二次揮手:
服務端發回一個數據包給客戶器,其中ACK=1,ack number=u+1,序列號seq=v。然后客戶端進入FIN_WAIT_2狀態,服務端進入CLOSE_WAIT狀態。
- 第三次揮手:
服務端斷開與客戶端的鏈接,發回客戶端一個數據包,其中FIN=1,ACK=1,seq=w,和ack number=u+1.服務器進入LAST_ACK狀態
- 第四次揮手:
客戶端發送數據包到服務端,其中ACK=1,ack number=w+1.客戶端進入TIME_WAIT狀態,等待2MAL進入close狀態,服務器也進入close狀態。
Socket連接
socket是對TCP/IP協議的封裝成的接口,方便程序員更方便的使用TCP/IP協議。不過需要注意的是socket可以基于TCP也可以基于UDP。socket連接的建立至少需要一對套接字:Client socket和Server socket
1. 連接過程
服務端監聽
客戶端請求
連接確認
特點
基于TCP的socket連接可能是長連接可能是短連接,長連接需要定時發送心跳包來維持。
HTTP協議
超文本傳送協議(Hypertext Transfer Protocol )建立在TCP/IP基礎上,他的特點是客戶端發送的每次請求都需要服務端的響應,請求結束后主動釋放連接,所以是一種短連接。
http的請求/響應步驟
1. 客戶端連接到web服務器
客戶端與web服務器的HTTP端口(默認80)建立一個TCP套接字連接
2. 客戶端發送HTTP請求
通過TCP套接字,客戶端向web服務器發送一個請求報文。請求報文由請求行(request line),請求頭(header),空行和請求數據四部分組成。如下圖
2.1 請求行
如圖所示,請求行由三個字段構成:請求方法,URL,HTTP協議版本。
其中HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT
2.2 請求頭
請求頭由key:value的形式構成。比如
Content-Type:請求體/響應體的類型
User-Agent:產生請求的瀏覽器類型。
Accept:客戶端可識別的內容類型列表。
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
2.3 空行
發送回車符和換行符,通知服務器以下不再有請求頭
2.4 請求數據
請求數據不在GET方法中使用,而是在POST方法中使用
3. 服務器接收請求并返回HTTP響應
HTTP響應報文也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文.如下圖
4. 釋放連接
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求
5. 客戶端解析HTML內容
http與https的區別
HTTP傳輸的數據都是明文的,未加密的,https通過SSL(Secure Sockets Layer)協議對數據進行加密。此處不再展開
End。