TCP套接字編寫,多進程多線程版本 Linux網絡通信

預備知識源IP地址和目的IP地址IP地址在上一篇博客中也介紹過,它是用來標識網絡中不同主機的地址 。兩臺主機進行通信時,發送方需要知道自己往哪一臺主機發送,這就需要知道接受方主機的的IP地址,也就是目的IP地址,因為兩臺主機是要進行通信的,所以接收方需要給發送方進行一個響應,這時接收方主機就需要知道發送方主機的IP地址,也就是源IP地址 。有了這兩個地址 , 兩臺主機才能夠找到對端主機 。

  • 源IP地址: 發送方主機的IP地址 , 保證響應主機“往哪放”
  • 目的IP地址: 接收方主機的IP地址,保證發送方主機“往哪發”
端口號端口號是屬于傳輸層協議的一個概念,它是一個16位的整數,用來標識主機上的某一個進程
注意:一個端口號只能被一個進程占用
在上面說過,公網IP地址是用來標識全網內唯一的一臺主機,端口號又是用來標識一臺主機上的唯一一個進程 , 所以IP地址+端口號 就可以標識全網內唯一一個進程
端口號和進程ID:二者都是用來唯一標識某一個進程 。它們的區別和聯系是:
一臺主機上可以存在大量的進程 , 但不是所有的進程都需要對外進行網絡請求 。任何的網絡服務和客戶端進程通信,如果要進行正常的數據通信,必須要用端口號來唯一標識自身的進程,只有需要進行網絡請求的進程才需要用端口號來表示自身的唯一性,所以說端口號更多的是網絡級的概念 。進程pid可以用來標識所有進程的唯一性,是操作系統層面的概念 。二者是不同層面表示進程唯一性的機制 。
源端口號和目的端口號:兩臺主機進行通信 , 只有對端主機的IP地址只能夠幫我們找到對端的主機,但是我們還需要找到對端提供服務的進程,這個進程可以通過對端進程綁定的端口號找到 , 也就是目的端口號,同樣地,對端主機也需要給發送方一個響應,通過源IP地址找到發送方的那一臺主機,找到主機還是不夠的,還需要找到對端主機是哪一個進程發起了請求 , 響應方需要通過發起請求的進程綁定的端口號找到該進程,也就是源端口號,然后就可以進行響應 。
  • 源端口號: 發送方主機的服務進程綁定的端口號,保證接收方能夠找到對應的服務
  • 目的端口號: 接收方主機的服務進程綁定的端口號,保證發送方能夠找到對應的服務
socket通信的本質: 跨網絡的進程間通信 。從上面可以看出,網絡通信就是兩臺主機上的進程在進行通信 。
注意:一個局域網才擁有一個獨立的IP,IP地址只能定位到一個局域網,無法定位到具體哪臺設備 , 要想定位到哪臺設備,就必須知道這個設備的MAC地址,IP地址解決的是數據在外網(因特網,互聯網)的傳輸問題 , 而MAC解決的是數據在內網(局域網)的傳輸問題 , 但是MAC地址不需要我們組包,鏈路層底層協議棧就會幫你組好 。
Socket套接字Socket 是在應用層和傳輸層之間的一個抽象層,它把 TCP/IP 層復雜的操作抽象為幾個簡單的接口,供應用層調用實現進程在網絡中的通信 。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,進程間通信就被冠名為文件描述符(file descriptor),Socket 是一種“打開—讀/寫—關閉”模式的實現,服務器和客戶端各自維護一個“文件”,在建立連接打開后,可以向文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件 。
TCP套接字編寫,多進程多線程版本 Linux網絡通信

文章插圖
在網絡通信中,套接字一定是成對出現的 。一端的發送緩沖區對應對端的接收緩沖區 。
重點:套接字本質上也是一個文件描述符 , 指向的是一個“網絡文件” 。普通文件的文件緩沖區對應的是磁盤,數據先寫入文件緩沖區,再刷新到磁盤,“網絡文件”的文件緩沖區對應的是網卡 , 它會把文件緩沖區的數據刷新到網卡,然后發送到網絡中 。創建一個套接字做的工作就是打開一個文件,接下來就是要將該文件和網絡關聯起來,這就是綁定的操作,完成了綁定,文件緩沖區的數據才知道往哪刷新 。
網絡字節序我們已經知道,內存中的多字節數據相對于內存地址有著大端和小端的區分 。同樣,網絡數據流同樣有大端和小端的區分 。
思考一下,如何定義網絡數據流的地址呢?
發送主機通常將發送緩沖區中的數據按內存地址從低到高的順序發出,接收主機把從網絡上接到的字節一次保存在接收緩沖區中,也就是按照內存地址從低到高的順序保存 。

推薦閱讀