TCP與UDP的相關知識
- TCP的三次握手具體發生在哪個函式中
- 補充知識:
TCP的三次握手具體發生在哪個函式中
在Linux編程中,在進行TCP網路編程時,通常分為客戶端和服務器端兩個模塊.
客戶端:
- fd=socket(); //利用socket生成檔案描述符fd;
- bind(); //利用bind進性埠系結(這里也可以不進行系結,不系結則隨機分配,由于客戶端不需要特定的埠,所以一般不進行系結)
- newfd=connect(); //利用connect函式向服務器發送請求,請求成功后會回傳一個新的檔案描述符
- send(newfd,buf,length,0);//利用newfd向服務器發送資料
- recv();接收服務器發來的資料
服務器
- fd=socket(); //利用socket生成檔案描述符fd;
- bind(); //系結服務器對外提供的埠
- listen();設定服務器監聽的客戶端的數量,主要是為了防止惡意請求對Linux內核性能的破壞,下面會具體說
- clientfd=accept();//接受客戶端請求,回傳客戶端fd,以供服務器與客戶端建立連接
- send();recv();//與客戶端類似
三次握手

上圖展現了TCP三次握手的基本架構,那么TCP三次握手具體發生在客戶端與服務器端的哪個函式中呢?
我們都知道客戶端是利用connect函式向服務器端發送通信請求的,所以在tcp三次握手中,第一次握手是由客戶端中的connect函式引發的,
在服務器端,當收到客服端的連接請求時,會為其分配相應的檔案描述符并將其存放在一個請求佇列中,也就是圖中的syn佇列,此時請求佇列中的檔案描述符暫時還不能用于通信(沒有完成三次握手),之后服務器會回復確認資訊給客服端(第二次握手),最后客戶端會回復一個確認資訊給服務器端(至此三次握手結束),當服務器收到客戶端的確認資訊后,會將對應客戶端的fd,從請求佇列中取出放入另一個佇列中,也就是圖中accept佇列,之后服務器端的accept函式會從accept佇列中取檔案描述符與相應客戶端進行資料通信,也就是說其實服務器端對應的函式并沒有參與tcp三次握手,僅僅在三次握手結束后,利用已經完成三次握手的客戶端檔案描述符進行通信,
**
補充知識:
**
在服務器端listen函式的作用
listen函式主要是為服務器設定最多客戶端連接數,也就是上述說的syn佇列的大小,有人肯定說為什么要設定限制,無限多不是更好,事實上并不是這樣,因為如果設定了無限,當有人想要攻擊服務器,就可以向服務器不斷發送通常請求(也就是第一次握手),服務器隨后發送確認資訊給客戶端(第二次握手),但客戶端并不給服務器確認資訊(第三次握手),這就導致了,服務器的請求佇列越來越長,占用大量的系統記憶體,降低系統性能,而且系統中檔案描述符的數量是有限的,大量的檔案描述符被占用,也將導致其他程式無法進行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/283075.html
標籤:其他
