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,單機可以接...