uinternet:使用tcp/ip協議組成的網路
internet:使用各種協議組成的網路
internet是一種internet,反之則說法錯誤。
bzero起源於berkeley
memset起源於ansi
read返回0表示對端關閉了連線,不論是阻塞還是非阻塞都是這樣
read返回負值表示出現了錯誤,比如中斷等
執行緒類函式失敗時不設定errno,是通過返回值表示錯誤,統一起見可以把返回值賦值到errno,接下來呼叫err_sys列印出錯誤資訊
應用程式使用原始套接字可以繞過傳輸層
應用程式使用資料鏈路介面可以繞過網路層
第二章:
tcp特性:
1,面向連線
2,可靠傳輸,確切的說是盡可能可靠傳輸+故障通知;重傳依賴的乙個重要的點是 rtt估算
3,收發排序,確保收到完整有序的資料
4,流量控制,傳送視窗控制傳送速度。
5,tcp連線是全雙工的。
tcp連線的三路握手過程:
前提:伺服器呼叫socket,bind,listen來完成被動開啟
1,客戶端呼叫connect進行主動開啟,客戶tcp會傳送乙個syn
2,伺服器對客戶端的syn傳送ack進行響應,並且傳送syn分節,通知客戶端傳送資料的初始序列號;ack表示期望收到客戶端的下乙個分節的序列號,syn+1
3,客戶端對服務端的syn進行ack確認
說明:為什麼syn要佔乙個位元組的序列號空間?syn沒有攜帶任何資料啊?
tcp協議是可靠傳輸協議,除了資料部分,開始和結束命令也需要進行確認,syn和fin都需要進行確認,所以就統一按照資料的方法來增加序列號實現了。
這兩篇文章回答的都比較好。
tcp斷開的四次握手
1,主動關閉的一方傳送fin;
2,tcp協議棧對fin進行確認,並且放到緩衝區末尾。
3,應用程序收到了對端傳送的fin,處理完成之後也執行關閉,傳送fin到對端;
4,主動關閉的一方傳送ack進行確認。
至此連線關閉完成。
tcp連線建立時狀態轉換圖
伺服器端listen之後會處在listening狀態
客戶端執行主動開啟,傳送syn後會進到syn_sent狀態;
伺服器收到客戶端傳送的syn後對syn進行ack,並且傳送伺服器端的syn,進入到syn_receved狀態;
客戶端收到伺服器的ack,並且對伺服器的syn進行ack確認,進入到established狀態
伺服器收到ack後進入到established狀態。
tcp連線斷開時狀態轉換圖
假設客戶端先關閉連線
客戶端傳送fin報文,狀態從established轉換為fin_wait_1;
伺服器協議棧傳送ack,變成close_wait;
客戶端收到伺服器端傳送的ack,從fin_wait_1轉換為fin_wait_2;
應用程序收到客戶端傳送的fin後,也執行關閉操作,傳送fin報文,狀態轉換為last_ack?
客戶端收到伺服器端的fin報文,傳送ack,狀態轉換為time_wait狀態,並且狀態儲存2msl時間。
伺服器收到客戶端的ack後,狀態轉換為closed。
為什麼執行主動關閉的一方最終的狀態是time_wait?為什麼需要維持2msl
tcp是可靠的通訊協議,最後傳送給伺服器端的ack有可能會丟失,也就意味著伺服器端會再次傳送fin,客戶端需要響應。
msl指的是包的最大生存時間(雖然msl其實是乙個指示最大跳數),time_wait儲存2msl也就意味著過來的包和發出去的包都會在這段時間內在網路上消失,如果再次建立乙個相同的四元組連線,那麼網路上就不會有之前連線的資料報存在。
這個msl和fin重發說的是兩個不同的點,在time_wait狀態不會再收發除了fin ack之外的任何資料,收到也是丟棄操作,伺服器端的fin在last_ack狀態下應該也只會重發一次,還有fin的重試時間應該是比msl小的多的乙個時間。
這裡有個點,我一直在糾結:如果伺服器在last_ack沒有收到客戶端的ack,會進行重發,那麼伺服器端再次發出fin,到客戶端收到回應ack,其實已經過了一段時間,但是在2msl以內,但是在發出不久後time_wait狀態就超過2msl了,但是發出的ack還在傳輸中,那麼這種狀態是如何處理?伺服器端應該在last_ack也會維持一段時間?只要四元組滿足不了就不會有問題。
tcp埠號:
通用的埠是在網際網路已分配數值權威機構iana(international assigned numbers authority)維護著,
眾所周知的埠0-1023,iana控制,對於unix也需要特權使用者才能使用。
1024-49151不受iana控制,但是會登記使用情況。
49152-65535私用埠。
mtu指的是最大傳輸單元(maximum transmission unit)由硬體決定,是乙個資料鏈路層使用的概念,在網際網路裡面是1500
mss是最大分節大小(maximum)是乙個tcp層的概念,目的是用於向對端tcp通告每個分節中能傳送的最大tcp資料值,這樣就不用在ip層再進行切片。一般都是mtu減去tcp以及ip頭部大小,注意沒有鏈路層大小,也就是mtu不是傳送出去的包大小值,加上資料鏈路層頭部才是實際傳送物理包大小。
ip層切片是根據mtu的大小進行的。
程序程式設計1 Unix環境高階程式設計7章讀書筆記
process environment 程序的終止有些下面的方法 1.從main 函式return 2.呼叫 exit exit 屬於iso c 標準中定義的函式,會執行清理工作。包括關閉 io庫中所有開啟的檔案流 這會導致所有的檔案 buffer 都被flush 還會呼叫阿 texit 所註冊的退...
程序程式設計1 Unix環境高階程式設計7章讀書筆記
process environment 程序的終止有些下面的方法 1.從main 函式return 2.呼叫exit exit 屬於iso c 標準中定義的函式,會執行清理工作。包括關閉 io庫中所有開啟的檔案流 這會導致所有的檔案 buffer 都被flush 還會呼叫阿 texit 所註冊的退出...
程序程式設計1 Unix環境高階程式設計7章讀書筆記
process environment 程序的終止有些下面的方法 1.從main 函式return 2.呼叫exit exit 屬於iso c 標準中定義的函式,會執行清理工作。包括關閉 io庫中所有開啟的檔案流 這會導致所有的檔案 buffer 都被flush 還會呼叫阿 texit 所註冊的退出...