socket 埠 程序的關係

2021-08-19 19:02:39 字數 3137 閱讀 8247



socket、埠、程序的關係

2023年06月25日 15:12:06

socket、埠、程序的關係!

埠是tcp/ip協議中的概念,描述的是tcp協議上的對應的應用,可以理解為基於tcp的系統服務,或者說系統程序!如下圖,ftp就需要占用特定的tcp埠。

而 socket 呢,是網路程式設計中的概念,對tcp/ip協議進行了抽象和實現,並為應用層提供介面。這裡的應用a,可以是ftp應用,它屬於使用者程序,通過socket與核心中的網路協議棧進行互動。

socket 是核心,是樞紐,是程序與網路建立關係的必經之路!

1 核心是如何將資料報**至 socket 的呢?

網路資料首先到達網絡卡,然後進入核心,由網路協議棧去處理,那麼核心是如何進行資料分發的呢?它怎麼知道該如何把資料交給特定的使用者程序呢?

這時,就需要 socket 發揮作用了!

socket 中儲存了特定的四元組: 源ip+port,目的ip+port;

1> bind 到特定 ip 和 port 的socket 對應 [src ip, src port) <=> (*, *)] ;

2> connect 到特定目的ip+port 的 socket 對應 [src ip, src port) <=> (dst ip, dst port)];

3> accept 返回了的 socket 對應 [src ip, src port) <=> (dst ip, dst port)];

那麼核心根據資料報的四元組資訊,就可以鎖定特定的socket了。並可,系統中所有 socket 中的四元組資訊,必定唯一,不可能重複!

2 程序與socket的關係是怎樣的呢?

每個程序,在核心中都有乙個表,儲存了該程序申請並占用的所有 socket 描述符,在程序看來,socket 其實跟檔案也沒有什麼不同,只不過通過描述符獲得的物件不同而已,介面對應的系統呼叫也不同。

那麼程序跟socket是一一對應的嗎?

其實不然,socket是一種資源,就像檔案一樣,乙個程序開啟了,另乙個程序也可以用,只不過socket比較特殊而已。

理論上,能夠通過 sendmsg 將 socket 描述符傳遞給其他程序,這樣其他程序就可以呼叫該描述符的介面了。這種場景確實不怎麼會用到,也沒有進行實際驗證。

當然,父子程序間,還有執行緒間,進行 socket 的共享,是比較常見的。

3 程序與埠

程序與埠,其實並沒有什麼直接或必然的關係,關鍵還是socket!

wireshark 抓包檢視tcp協議資料報詳情:

server:

#-*- coding:utf-8 -*-

from

socketserver import

tcpserver, baserequesthandler

import

traceback

class

mybaserequesthandlerr

(baserequesthandler)

:"""

#從baserequesthandler繼承,並重寫handle方法

"""def

handle

(self)

:#迴圈監聽(讀取)來自客戶端的資料

while

true

: #當客戶端主動斷開連線時,self.recv(1024)會丟擲異常

try: #一次讀取1024位元組,並去除兩端的空白字元(包括空格,tab,\r,\n)

data = self.request.recv(1024

).strip()

#self.client_address是客戶端的連線(host, port)的元組

print

"receive from (%r):%r"

% (self.client_address, data)

#轉換成大寫後寫回(發生到)客戶端

self.request.sendall(data.upper())

except

: traceback.print_exc()

break

if __name__ == "__main__"

: #telnet 127.0.0.1 9999

host = ""

#主機名,可以是ip,像localhost的主機名,或""

port = 9999

#埠addr = (host, port)

#購置tcpserver物件,

server = tcpserver(addr, mybaserequesthandlerr)

#啟動服務監聽

總結socket 的本質是一種資源,它包含了端到端的四元組資訊,用來標識資料報的歸屬。因此,儘管 tcp 協議的埠號只有 65535 個,但是程序可擁有的 socket 資料卻不限於此(受限於程序最大檔案描述符資料);

socket 埠 程序的關係

socket 埠 程序的關係!埠是tcp ip協議中的概念,描述的是tcp協議上的對應的應用,可以理解為基於tcp的系統服務,或者說系統程序!如下圖,ftp就需要占用特定的tcp埠。而 socket 呢,是網路程式設計中的概念,對tcp ip協議進行了抽象和實現,並為應用層提供介面。這裡的應用a,可...

socket 子程序bind埠占用問題

發現乙個socket引數可以在子程序執行的時候可以不繼承父程序 fork 的控制代碼,父程序退出 子程序未退出的情況下,可以在下次父程序重新執行時,再次bind的時候不會失敗。close server socket on exec so cgi s can t write to it if fcnt...

Socket 埠的限制

由乙個經典問題來引出 一台機器最多可以建立多少tcp連線?這個問題基本都是從server的角度來回答,因為很少會有客戶端需要建立多個連線。需要記住 client ip client port server ip server port,乙個四元組可以確定乙個連線 一.對於單機server,單機可以接...