1. 程式人生 > >TCP傳送緩衝區

TCP傳送緩衝區

每一個TCP套接字都有一個傳送緩衝區,可以使用SO_SNDBUF套接字選項來更改緩衝區的大小。當某個程序呼叫write時,核心從該應用程序的緩衝區複製所有資料到套接字的傳送緩衝區中,如果該套接字的傳送緩衝區容不下該應用程序的所有資料(或是應用程序的緩衝區大於套接字的傳送緩衝區,或是套接字的傳送緩衝區中已有其他資料),該應用程序將被投入睡眠,這裡假設該套接字是阻塞的,它通常是預設設定。核心將不從write系統呼叫返回,直到應用程序緩衝區中所有資料都複製到套接字傳送緩衝區。因此,從寫一個TCP套接字的write呼叫成功返回僅僅表示我們可以重新使用原來的應用程序緩衝區,並不表明對端的TCP或應用程序已接受到資料。

這一端的TCP提取套接字傳送緩衝區中的資料並把它傳送給對端的TCP,其過程基於TCP資料傳送的所有規則。對端TCP必須確認收到的資料,伴隨來自對端的ACK的不斷到達,本段TCP至此才能從套接字傳送緩衝區中丟棄已確認的資料。TCP必須為已傳送的資料保留一個副本,直到它被對端確認為止。本端TCP以MSS大小或是更小的塊把資料傳遞給IP,同時給每個資料塊安上一個TCP首部以構成TCP分節,其中MSS或是由對端告知的值,或是536(若未傳送一個MSS選項為576-TCP首部-IP首部)。IP給每個TCP分節安上一個IP首部以構成IP資料報,並按照其目的的IP地址查詢路由表項以確定外出介面,然後把資料報傳遞給相應的資料鏈路。**每個資料鏈路都有一個數據佇列,如果該佇列已滿,那麼新到的分組將被丟棄,並沿協議棧向上返回一個錯誤:從資料鏈路到IP,從IP到TCP。**TCP將注意到這個錯誤,並在以後某個時候重傳相應的分節。應用程式不知道這種暫時的情況。