tcp輸出
每個tcp套接字都有乙個傳送緩衝區,可以用so_sendbuf套接字選項來更改該緩衝區的大小。
當某個應用程式呼叫write時,核心從該應用程序緩衝區中複製所有資料到套接字的傳送緩衝區。如果套接字的傳送緩衝區容不下該應用程序的所有資料則該應用程序被投入睡眠。假設該套接字是阻塞的,則write將不從write系統呼叫返回,直到應用程序緩衝區中的所有資料都複製到套接字傳送緩衝區,並不表明對端tcp或者應用程式收到資料。
write的返回僅僅表示資料從應用程序的緩衝區傳送到了套接字的傳送緩衝區。
這一端的tcp提取套接字傳送緩衝區中的資料並把它傳送給對端tcp,其過程基於tcp傳輸的所有規則。對端tcp必須確認收到的資料,伴隨著對端的ack的不斷到來,本端tcp至此才從套接字傳送緩衝區中丟棄已經確認的資料。tcp必須為傳送的資料保留乙個副本直到它被對端確認。
本端tcp以mss或者大小更小的塊把資料傳遞給ip,同時給每個資料塊按上乙個tcp首部以構成tcp分節。mss或者是由對端通告的值或者是536。ip給每個tcp分節按上乙個ip首部以構成ip資料報,並按照其目的位址查詢路由表表項以確定外出介面。然後把資料報傳遞給相應的資料鏈路。每個資料鏈路都有乙個輸出佇列,如果該佇列已滿則那麼新到的分組將會被丟棄,並沿協議棧向上返回乙個錯誤:從資料鏈路層到ip,再從ip到tcp,tcp將注意這個錯誤並在一段時間後重傳相應的分節。
udp輸出
udp的套接字傳送緩衝區其實是不存在的,因為其不必儲存傳送資料的副本。任何udp套接字都有傳送緩衝區大小,他只是乙個寫到udp套接字的udp資料報的上限。應用程式的資料沿協議棧向下傳遞的時候通常被複製到某種格式的乙個核心緩衝區,然而當該資料被傳送之後,這個副本就被資料鏈路層丟棄了。
這一端的udp簡單的給來自使用者的資料報按上他的8位元組的首部以構成udp資料報,然後傳遞給ip.ipv4或者ipv6給資料報按上相應的ip首部以構成ip資料報,執行路由操作確定外出介面然後或者直接把資料加入資料鏈路層輸出佇列,或者分片後再把每個片段加入資料鏈路層的輸出佇列。udp沒有mss這一策略,故大資料報可能會被分片。write呼叫的返回表示所寫的資料報或者其所有的片段已被加入資料鏈路層的輸出佇列。有些時候當資料鏈路層佇列空間不夠時都不返回錯誤。
UDP網路應用程式編寫和套接字及相關定義
主要步驟 1.載入套接字型檔 2.建立套接字 3.繫結套接字 與埠繫結 4.傳送或等待接收資料 5.關閉套接字 注意 如果要同時進行收發操作時,收的時候可以按照預設的套接字使用 即接收任意ip傳送的資料 但是傳送時要注意,如果是傳送給指定的ip,需要重新建立套接字的物件,並把指定ip進行賦值,其具體...
應用程式連線Oracle rac的URL寫法
oracle rac 集群示意圖 是高可用性的一種,也是oracle資料庫支援網格計算環境的核心技術。應用程式連線oracle rac的url寫法一例 jdbc oracle thin description address list address protocol tcp host dc1.bp...
go應用程式寫kafka阻塞(大坑)
由於是大資料,打日誌相對麻煩,使用玄坤 選點打日誌,才把這個bug糾出來。使用庫 sarama addrs strings.split config.kafka.realbroker,kafkaconfig sarama.newconfig kafkaconfig.producer.timeout ...