歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix基礎知識

UNIX網絡編程:TCP輸出及UDP輸出

TCP輸出

每一個TCP套接字有一個發送緩沖區,我們可以使用SO_SNDBUF套接字選項來更改該緩沖區的大小。當某個應用進程調用write時,內核從該應用進程的緩沖區中復制所有數據到(或是應用程序的緩沖區大於套接字的發送緩沖區,或是套接字的發送緩沖區中已有其他數據),該應用進程將被投入睡眠。這裡假設該套接字是阻塞的,他是通常的默認設置,默認鍵不從write系統調用返回,

直到應用進程緩沖區中的所有數據都復制到套接字發送緩沖區。因此,從寫一個TCP套接字的write調用成功返回僅僅表示我們可以重新使用原來的應用進程緩沖區,並不表明對端的TCP或應用進程已接收到數據。

這一端的TCP提取套接字發送緩沖區中的數據並把它發送給對端的TCP,其過程基於TCP數據傳送的所有規則。對端TCP必須確認收到的數據,伴隨來自對端的ACK的不斷到達,本端TCP至此才能從套接字發送緩沖區中丟棄已確認的數據。TCP必須為已發送的數據保留一個副本,直到它被對端確認為止。

UDP輸出

這裡我用虛線框展示套接字發送緩沖區,因為它實際行並不存在。任何UDP套接字有一個發送緩沖區,我們可以使用SO_SNDBUF套接字選項來更改該緩沖區的大小。不過它僅僅是可以寫到該套接字的UDP數據報的大小上限。如果

一個應用進程寫一個大於套接字發送緩沖區大小的數據報,內核將返回該進程一個EMSGSIZE錯誤。既然UDP是不可靠的,它不必保存應用進程的數據的一個副本,因此無需一個真正的發送緩沖區。(應用進程的數據在沿協議棧向下傳遞時,通常被復制到某種格式的一個內核緩沖區中,然而當該數據被發送之後,這個副本就被數據鏈路層丟棄了)。

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

Copyright © Linux教程網 All Rights Reserved