UNIX網路程式設計第一二章讀書筆記

2021-08-17 17:53:35 字數 2606 閱讀 9447

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 所註冊的退出...