Linux 的端口和套接字

端口

Linux 的端口是一個邏輯概念,是傳輸層協議的內容,其由 TCP/IP 協議定義,是一個 0–65535 之間的一個2字節16位的整數。

端口號(port)用來標識一個進程, 告訴操作系統當前的數據要交給哪一個進程來處理,IP地址 + 端口號能夠標識網絡上的某一臺主機的某一個進程;一個進程可以綁定多個端口號,但是一個端口號不能被多個進程綁定,一個端口號只能被一個進程佔用。

傳輸層協議(TCP和UDP)的數據段中有兩個端口號, 分別叫做源端口號和目的端口號,就是在描述 “數據是誰發的, 要發給誰”。

端口號範圍劃分

  • 0 - 1023:“固定”端口,指一些常用的軟件或者 TCP/IP 協議中確定和公佈的,通常來說不會被其他程序使用。
  • 1024 - 65535:操作系統動態分配的端口號, 客戶端程序的端口號就是由操作系統從這個範圍分配。

Linux 中的常見“固定”端口和對應的協議

協議 端口號
FTP 21
TELNET 23
TFTP 69
SNMP 161
SSH 22
HTTP 80
SMTP 25
DNS 53
HTTPS 443

可用如下命令查看“固定”端口

cat /etc/services

netstat
netstat 是一個用來查看網絡狀態的重要工具.
語法:netstat [選項]
功能:查看網絡狀態
常用選項

  • n 拒絕顯示別名,能顯示數字的全部轉化成數字
  • l 僅列出有在 Listen (監聽) 的服務狀態
  • p 顯示建立相關鏈接的程序名
  • t (tcp)僅顯示tcp相關選項
  • u (udp)僅顯示udp相關選項
  • a (all)顯示所有選項,默認不顯示LISTEN相關選項

pidof
查看服務器的進程 id 。
語法:pidof [進程名]
功能:通過進程名, 查看進程id

套接字

套接字(Sockets),即網絡進程的進程 ID ,和普通的進程 ID 不同,網絡進程的ID 是由運行這個進程的計算機的 IP 地址以及這個進程使用的端口(Port)組成的,在同一臺計算機上,一個端口只能分配給一個進程,這樣就可以確定網絡中計算機上的一個進程。

套接字的組成

在這裏插入圖片描述
可以使用 netstat-all 命令來查看當前系統中網絡應用進程的套接字和端口。

Linux 的套接字包括了BSD套接字和INET套接字兩部分。

BSD套接字接口是Linux套接字的基礎,套接字可以看成一種特殊的管道, BSD套接字通常包括以下幾種類型:

  • Steam(數據流):該套接字提供了兩個方向的序列數據流,這些數據流保證在傳輸過程中數據不丟失、不破壞或不重複,數據流套接字由 Internet(INET)地址族的 TCP 協議所支持。
  • Datagram(數據報):該套接字也提供兩個方向上的數據傳送,但不像數據流套接字,它們不提供消息到達的保證。即使到達也不保證這些數據報按照一定的順序到達(或丟失、重複)。這種類型的套接字由 Internet 地址族的 UDP 協議所支持。
  • Raw(原始套接字):該套接字允許進程直接訪問底層協議。例如,可以爲以太網設備打開一個 Raw Socket,以使用原始 IP 數據進行傳輸。
  • Reliable Delivered Message(可靠傳遞消息):該套接字非常類似於數據報套接字,但是可保證數據的可靠傳輸。
  • Sequenced Packets(順序數據報):這個套接字類似於數據流套接字,但數據包的大小固定。
  • Packet(包):這不是標準的 BSD 套接字類型,它是一個 Linux 特定的擴展,允許進程在設備層直接訪問 Packet。

在 Linux 網絡編程中最常使用的是支持 TCP 協議的數據流套接字、支持 UDP 協議的數據報套接字和可以直接對底層協議 IP 進行訪問的原始格式套接字。

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