埠 TCP和UDP輸出

2021-09-23 22:29:30 字數 2776 閱讀 6421

任何時候,多個程序可能同時使用 tcp、udp、sctp 這三種傳輸層協議中的任何一種。這三種協議都使用 16 位整數的埠號來區分這些程序。

當乙個客戶想要和乙個伺服器聯絡時,它必須標識想要與之通訊的這個伺服器。

一方面,tcp、udp、sctp 定義了一組眾所周知的埠,用於標識眾所周知的服務。舉例說明,支援 ftp 的任何 tcp/ip 實現都將 21 埠賦予 ftp 伺服器。支援 tftp 的任何 udp 實現都將 69 埠賦予 tftp 伺服器。

另一方面,客戶通常使用短期存活的臨時埠,這些由傳輸層協議自動分配。

iana 維護著一張埠號分配狀況清單。其中埠號被劃分為以下三段:

乙個 tcp 連線的套接字對是乙個定義該連線的兩個端點的四元組:本地 ip 位址、本地 tcp 埠號、外地 ip 位址、外地 tcp 埠號。套接字對唯一標識乙個網路上的每乙個 tcp 連線。

標識每個端點的兩個值 (ip 位址和埠號) 通常稱為乙個套接字。

併發伺服器種主伺服器迴圈通過派生乙個子程序來處理每乙個新的連線。如果乙個子程序繼續使用伺服器眾所周知的埠來服務乙個長時間的請求,那將會發生什麼?

舉乙個例子說明。

在主機 freebsd 上啟動伺服器,該主機是多宿的,其 ip 位址為 12.106.32.254 和 192.168.42.1。伺服器在它眾所周知的埠 21 上執行被動開啟,從而等待可u的請求。

我們使用記號 指示伺服器的套接字對。伺服器在任何本地介面的埠 21 上等待連線請求。任何外地 ip 位址和任何外地埠請求連線。

接下來在 ip 位址為 206.168.112.219 的主機上啟動第乙個客戶,它對伺服器的 ip 位址之一 12.106.32.254 執行主動開啟,假定客戶主機的 tcp 選用的臨時埠為 1500。

當伺服器接收到這個客戶的連線請求時,它 fork 乙個自身的副本,讓子程序來處理這個客戶的請求。

假設現在在客戶主機上另外有乙個客戶請求連線到同乙個伺服器,客戶主機的 tcp 選擇的臨時埠為 1501。

通過這個例子應該注意:tcp 無法僅通過檢視目的埠號來分離外來的節點到不同的端點。它必須檢視套接字對的所有 4 個元素才能確定哪個端點接收某個到位的分節。

首先介紹一下影響 ip 資料報大小的限制。

如圖展示了某個應用程序寫資料到乙個 tcp套接字中時發生的步驟。

每乙個 tcp 套接字都有乙個傳送緩衝區。當某個應用程序呼叫 write 時,核心從該應用程序的緩衝區中複製所有的資料寫到套接字的傳送緩衝區。如果該套接字的傳送緩衝區容不下該應用程序的所有資料,該應用程序將被投入睡眠。核心將不從 write 系統呼叫返回,直到應用程序緩衝區中的所有資料都複製到套接字傳送緩衝區。因此,從寫乙個 tcp 套接字的 write 呼叫成功返回僅僅標識我們可以重新使用原來的應用程序緩衝區,而不代表對端的 tcp 或應用程式已經接收到資料。

本端的 tcp 提取套接字傳送緩衝區中的資料並將其傳送給對端 tcp,其過程基於 tcp 資料傳送的所有規則。對端 tcp 必須確認收到的資料,伴隨來自對端的 ack 不斷到達,本端 tcp 至此才從套接字傳送緩衝區中丟棄已確認的資料。tcp 必須為已傳送的資料保留乙個副本,直至它被對端確認。

本端 tcp 以 mss 大小的或更小的塊把資料傳遞給 ip,同時給每個資料塊安上乙個 tcp 首部以構成 tcp 分節,其中 mss 或是由對端通告的值,或是最小重組緩衝區大小;ip 給每個 tcp 分節安上乙個 ip 首部以構成 ip 資料報,並按照其目的位址查詢路由表以確定外出介面,然後將資料報傳送給相應的資料鏈路。

如圖展示了某個應用程序寫資料到乙個 udp 套接字中時發生的步驟。

我們使用虛線框展示套接字傳送緩衝區,因為實際上它並不存在。任何 udp 套接字都有傳送緩衝區,不過它僅僅是寫到該套接字的 udp 資料報的大小上限。如果乙個應用程序寫乙個大於套接字傳送緩衝區大小的資料報,核心將返回該程序乙個 emsgsize 錯誤。既然 udp 是不可靠的,它不必儲存應用程式資料的乙個副本,因此無需乙個真正的傳送緩衝區。(應用程序的資料在沿協議棧向下傳遞時,通常被複製到某種格式的乙個核心緩衝區中,然後當該資料被傳送後,這個副本就被資料鏈路層丟棄了)

本端的 udp 簡單地給來自使用者的資料報安上它的 8 位元組的首部以構成 udp 資料報,然後遞給 ip。ipv4 或 ipv6 給 udp 資料報安上相應的 ip 首部以構成 ip 資料報,執行路由操作確定外出介面,然後直接將資料報或分片後加入資料鏈路層輸出佇列。如果某個 udp 應用程序傳送大資料報,那麼它們相比 tcp 應用資料更有可能被分片,因為 tcp 會把應用資料劃分成 mss 大小的塊,而 udp 沒有對等的方法。

從寫乙個 udp 套接字的 write 呼叫成功返回標識所寫的資料報或其所有片段已被加入到資料鏈路層的輸出佇列。如果該佇列沒有足夠的空間存放著資料報或其中分片,核心會返回乙個 enobufs 錯誤給應用程序。

Linux測試UDP 和 TCP 埠

1 tcp埠的連通性 tc埠的連通性,一般通過telnet檢測 tcp協議是面向連線的,可以直接通過telnet命令連線 telnet host ip port2 udp埠的連通性 因為公司網路防火牆一般對埠會有一些限制,通過公司網路訪問外部伺服器特定埠時,需要檢測與目標伺服器特定埠的連通性 對於u...

TCP和UDP協議常用埠彙總

埠 協議說明 udp常用埠 echo 將收到的資料報送給傳送端 smtp 簡單郵件傳輸協議 host name server 主機名服務 tacacs 登入主機協議 dns網域名稱服務 dhcp 動態主機配置檔案 tftp 簡單檔案傳輸協議 snmp 簡單網路管理協議 snmp 簡單網路管理協議 t...

TCP埠和UDP埠都是什麼意思

從專業的角度說,tcp的可靠保證,是它的三次握手機制,這一機制保證校驗了資料,保證了他的可靠性。而udp就沒有了,所以不可靠。不過udp的速度是tcp比不了的,而且udp的反應速度更快,qq就是用udp協議傳輸的,http是用tcp協議傳輸的,不用我說什麼,自己體驗一下就能發現區別了。再有就是udp...