TCP網路程式設計心得體會淺談
阿新 • • 發佈:2018-11-10
**在tcp程式設計中,我們以服務端為傳送端,客戶端為接收端舉例。通訊過程中傳送端和接收端都有一個接收緩衝區和傳送緩衝區(也就是說一邊兩個緩衝區),在程式設計過程中當我們使用send方法的時候所做的工作就是—-將程式中的資料傳送到計算機核心的傳送緩衝區,而當我們使用recv()方法時就是—將接收緩衝區中的資料讀取到程式中。而真正的資料互動就是tcp協議和計算機核心去完成了與我們的程式設計程式無關。
下面說幾種情況:**
1、傳送端多次傳送的資料,接收端可一次接受,說明tcp訊息是沒有訊息邊界的,
同時也說明tcp程式設計不是傳送端傳送一次訊息對應接收端接收一次訊息,同時還說
明接收端和傳送端都有相應的收發緩衝區(tcp全雙工)。
2 、當自身接收緩衝區存在資料時,自身此時關閉socket物件,也就是說接收緩
衝區還有資料沒有被應用程式讀時,會直接傳送RST包到對端,有可能導致對端的
應用程式正在讀取tcp緩衝區資料,卻突然收到RST包,導致對端tcp丟棄傳送和
接收緩衝區裡的所有資料,應該程式會丟資料。
3、當自身接收緩衝區存在資料時,對端此時關閉socket物件,此時斷開連線,
但是還是可以從自身接收緩衝區中讀取資料,不受影響。
4、如果在close時,傳送緩衝區中有資料還沒有傳送出去,本端應用程式無法確認,
對端tcp是否能收到(僅由tcp的機制實現安全交付)
5、send()只是負責拷貝,拷貝完立即返回,不會等待發送和傳送之後的ACK。
如果socket 出現問題,RST包被反饋回來。在RST包返回之時,如果send()還
沒有把資料全部放入核心或者傳送出去,那麼send()返回-1,errno被置錯誤
值;如果RST包返回之時,send()已經返回,那麼RST導致的錯誤會在下一次
send()或者recv()呼叫的時候被立即返回。
**
**
概念上容易疑惑的地方
(出自於http://www.cnblogs.com/my_life/articles/5363527.html再次深入理解TCP網路程式設計中的send和recv)
**
**1. TCP協議本身是為了保證可靠傳輸,並不等於應用程式用tcp傳送資料就一定是可靠的,必須要容錯;
2 . send()和recv()沒有固定的對應關係,不定數目的send()可以觸發不定數目的recv(),這話不專業,但是還是必須說一下,初學者容易疑惑;
3. 關鍵點,send()只負責拷貝,拷貝到核心就返回,我通篇在說拷貝完返回,很多文章中說send()在成功傳送資料後返回,成功傳送是說發出去的東西被ACK確認過。send()只拷貝,不會等ACK;
4. 此次send()呼叫所觸發的程式錯誤,可能會在本次返回,也可能在下次呼叫網路IO函式的時候被返回。**
歡迎指正!!!謝謝