Linux C編程(六) 之 網絡編程 (上)

網絡協議棧

在這裏插入圖片描述

網絡基礎

  • 在Linux網絡編程中,網絡協議主要分爲五層
    應用層
    傳輸層
    網絡層
    鏈路層
    物理層

  • TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是爲廣域網(WANs)設計的。
    TCP/IP協議存在於OS中,網絡服務通過OS提供,在OS中增加支持TCP/IP的系統調用——Berkeley套接字,如Socket,Connect,Send,Recv等

  • UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是屬於TCP/IP協議族中的一種。

  • socket位於應用層和傳輸層之間的socket抽象層

  • 集線器 交換機 路由器
    集線器 只是電信號的放大和分流 電氣層 物理層
    交換機 交換的是網幀, 鏈路層
    路由器 交換的是報文 網絡層

  • 以下三個網段被用作內網網段
    192網段
    172網段
    10網段

  • tcp 報文格式

在這裏插入圖片描述

  • IP 報文格式
    在這裏插入圖片描述

  • MAC幀格式
    在這裏插入圖片描述

  • 數據傳輸過程詳解圖
    在這裏插入圖片描述

socket詳解

  • socket套接字:
    socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。Socket就是該模式的一個實現, socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉).
    說白了Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。

  • 在這裏插入圖片描述

    對於每個程序系統都有一張單獨的表。精確地講,系統爲每個運行的進程維護一張單獨的文件描述符表。當進程打開一個文件時,系統把一個指向此文件內部數據結構的指針寫入文件描述符表,並把該表的索引值返回給調用者 。應用程序只需記住這個描述符,並在以後操作該文件時使用它。操作系統把該描述符作爲索引訪問進程描述符表,通過指針找到保存該文件所有的信息的數據結構。

tcp連接的三次握手和四次揮手

  1. 三次握手
  2. TCP協議通過三個報文段完成連接的建立,這個過程稱爲三次握手(three-way handshake),過程如下圖所示。
    • 第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
    • 第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
    • 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
      一個完整的三次握手也就是: 請求—應答—再次確認。

在這裏插入圖片描述
當客戶端調用connect時,觸發了連接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;服務器監聽到連接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K ,ACK J+1之後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立

  1. 四次揮手
    由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
    (1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送(報文段4)。
    (2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。
    (3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A(報文段6)。
    (4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1(報文段7)。
    在這裏插入圖片描述

tcp網絡編程模型

在這裏插入圖片描述

udp編程模型圖

在這裏插入圖片描述

不做過多文字描述…有錯誤之處歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章