linux TCP和UDP的差異項

2022-07-01 13:09:08 字數 1528 閱讀 4843

udp為什麼是不可靠的?bind和connect對於udp的作用是什麼?

1、能夠捕獲錯誤。因為udp是無狀態的,使用connect會在核心中建立乙個類似額的tcp的維護,這樣當網路異常時進行icmp回應時核心會通知應用,如果不使用connect 的話就接收不到錯誤

2、udp多次呼叫connect,會斷開之前的連線,建立新的連線。但是tcp只能使用一次

3、提高效率,

普通傳送:建立連線->傳送報文->斷開連線->建立連線->傳送報文->斷開連線

connect:建立連線->傳送報文->傳送報文

4、高併發增加穩定性,避免服務端相同的埠收到了其他的對端的資料

5、使用sendto和recvfrom需要指定埠和ip,但是使用connect就是需要使用一次

1、伺服器知道客戶端的埠的話,客戶端就可以bind,進行監聽資料

2、如果伺服器想先傳送資料的話,客戶端就需要進行bind,否則伺服器必須要等到客戶端建立連線傳送資料之後才知道對端的埠和ip

3、使用bind可以指定埠傳送

tcp是屬於資料流,但是udp是資料報。tcp中的每次應用傳送都是按照流一樣的效果,tcp有組包協議,每次傳送和接收都會有對應的分包和組包,tcp保證了應用接收的順序,tcp傳送的包大於mtu的時候會進行拆包,每個包都有tcp協議頭,進行校驗和重發。

但是udp是資料報服務。每次udp呼叫都發進行傳送,udp在核心中沒有傳送緩衝區,也不會進行資料複製,每次傳送都會立即傳送,當udp傳送到包大於mtu的時候。ip會進行拆包處理,首次udp的會帶有udp頭,但是後面的包沒有帶有頭,網路的包容易丟失之後,ip進行組包的時候就會校驗不過,導致整個資料報丟失。udp的包最好要小於mtu,降低丟包風險。

當傳送端應用程式使用sendto(或write)函式向乙個tcp連線寫入資料時,核心中的tcp模組首先把這些資料複製到與該連線對應的tcp核心傳送緩衝區中,然後tcp模組呼叫ip模組提供的服務,傳遞的引數包括tcp頭部資訊和tcp傳送緩衝區中的資料,即tcp報文段。

經過udp封裝後的資料稱為udp資料報 。udp對應用程式的封裝與tcp類似。不同的是,udp無須為應用層資料儲存副本,因為它提供的服務是不可靠的。當乙個udp資料報被成功傳送之後,udp核心緩衝區中的該資料報就被丟棄了(因此udp沒有真正意義上的傳送緩衝區,sendto的資料直接交給核心,由核心進行交給網路層)。如果應用程式檢測到該資料報未能被接受端正確接收,並打算重新傳送這個資料報,則應用程式需要重新從使用者空間將該資料拷貝到udp核心中。

總結:tcp有核心緩衝區,保證tcp的可靠到達,需要進行分組和重傳,但是udp沒有,udp沒有核心緩衝區,資料

資料都是直接傳送到底層,進行通訊.udp需要應用進行校驗是否可靠到達,udp資料報沒有傳送成功需要應用進行重新傳送.

tcp是位元組流;應用程式對資料的傳送和接收是沒有邊界限制。

udp是資料流,應用每次呼叫一次send,udp模組就會將資料傳送出去。

tcp通訊是位元組流,應用層拿到資料之後沒有明顯的邊界,就產生了黏包問題。解決方案:1、包是定長 2、可變包,帶有長度 3、固定分隔符

udp包是資料流,只有收到和未收到,不存在邊界問題

HTTP介面和UDP介面流量差異比較

有個手機軟體需要很頻繁的呼叫伺服器端介面,你知道的,每個位元組都是錢呀,錢呀錢,命相連呀。本來已經有個現成的tomcat的http get post 的介面,但是擔心流量消耗太大,需要做個評估,看是採用http介面,還是使用多執行緒的socket udp介面,於是就有了下面這一出。序號工具 描述1....

Linux TCP協議的程式設計流程

一 定義 tcp協議是面向連線的可靠的位元組流服務 tcp協議分為客戶端和服務端 伺服器是被動通訊,客戶端是主動通訊 二 伺服器的系統呼叫 1 方法 1 int socket 建立乙個用於監聽客戶端連線的網路套接字 原型 成功返回套接字的檔案描述符,失敗返回 1 domain 協議簇 af inet...

Kafka和mq的差異

其實,作為訊息佇列來說,企業中選擇mq的還是多數,因為像rabbit,rocket等mq中介軟體都屬於很成熟的產品,效能一般但可靠性較強,而kafka原本設計的初衷是日誌統計分析,現在基於大資料的背景下也可以做運營資料的分析統計,而redis的主要場景是記憶體資料庫,作為訊息佇列來說可靠性太差,而且...