TCP/IP、HTTP、socket

網絡由下至上:物理層、數據鏈路層、網絡層、傳輸層、應用層
IP協議對應網絡層
TCP協議對應傳輸層
HTTP協議對應應用層
socket是對TCP/IP協議的封裝和應用
TCP/IP協議可以說是傳輸層協議,主要解決數據如何在網絡中傳輸
HTTP是應用層協議,主要解決如何包裝數據
傳輸數據時,只使用TCP/IP協議,沒有應用層的參與無法識別數據內容,必須使用到應用層協議(如:HTTP、FTP、Telnet等),也可以自己定義
web使用HTTP協議作爲應用層協議,封裝HTTP文本信息,然後使用TCP/IP作爲傳輸層協議,將數據發到網上
socket是對TCP/IP協議的封裝,本身並不是協議,而是一個調用接口(API)通過socket才能使用TCP/IP協議
傳輸層的TCP協議是基於網絡層IP協議的,應用層的HTTP協議是基於傳輸層TCP協議的,socket本身不是協議,他提供給我們一個針對於TCP編程的接口

一、TCP三次握手
第一次握手:客戶端發送SYN包到服務器,並進入SYN_SEND狀態,等待服務器確認

第二次握手:服務端收到SYN包,必須確認客戶的SYN,同時自己也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN_RECV狀態

第三次握手:客戶端收到服務端SYN_ACK包,像服務器發送確認包ACK,此包發送完畢,客戶端和服務端進入ESTABLISHED狀態,完成三次握手

TCP三次握手

  • 握手過程中傳送的包裏不包含數據,三次握手後,客戶端與服務器才正式開始傳送數據
  • 理想狀態下,TCP連接一旦建立,在通信雙方中任何一方主動關閉連接前,TCP連接都將被一直保持下去
  • 斷開連接時,客戶端和服務端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”

二、四次握手
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送
(2)服務器B收到FIN,發回一個ACK,確認序號爲收到的序號加1。和SYN一樣,一個FIN佔用一個序號
(3)服務器B關閉與客戶A的連接,發送一個FIN給客戶端A
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1

四次握手

  • 服務端的LISTEN狀態下的socket當收到SYN報文的建立請求後,可以把ACK和SYN放在一個報文裏來發送。但關閉連接時,當收到FIN報文通知時,僅僅表示對方沒有數據發送給你了,但你未必把所有的數據全都發送給了對方,所以你未必會馬上關閉socket,即你還需要發送一些數據給對方後,再發送FIN報文給對方表示你現在同意關閉連接了,這裏ACK和FIN報文多數情況下分開來發送

三、利用socket建立網絡連接的步驟
建立socket連接至少需要一對套接字,其中一個運行於客戶端,稱爲ClientSocket,另一個運行於服務端,稱爲ServerSocket
套接字連接過程分爲:服務器監聽、客戶端請求、連接確認

  1. 服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接狀態,實時監控網絡狀態,等待客戶端的連接請求
  2. 客戶端請求:指客戶端的套接字提出連接請求,連接目標是服務器端套接字,爲此,客戶端的套接字必須首先描述他要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求
  3. 連接確認:當服務器端套接字監聽到或者是接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方正式建立連接。服務器端套接字繼續處於監聽狀態,繼續接受其他客戶端套接字的連接請求

四、TCP和UDP區別

  1. TCP面向連接的,三次握手在最低限度上保證了連接的可靠性
  2. UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。
發佈了23 篇原創文章 · 獲贊 1 · 訪問量 5177
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章