Linux-C 網路程式設計(1)TCP理解

2020-08-09 13:59:10

Linux-C 網路程式設計(1)TCP整理

TCP概述1

1.TCP協定分成了兩個不同的協定:

		·用來檢測網路傳輸中差錯的傳輸控制協定TCP
		·專門負責對不同網路進行互聯的網際網路協定IP

2.TCP/IPOSI是兩類非常重要的體系結構
3.兩種體系結構參考模型
tcp/ip与osi的模型对比

面試相關問題

TCP三次握手,四次分手
1.爲什麼連線的時候是三次握手,關閉的時候卻是四次握手?

因爲當Server端收到Client端的SYN連線請求報文後,可以直接發送SYN+ACK2報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回覆 回復一個ACK報文,告訴Client端,「你發的FIN報文我收到了」。只有等到我Server端所有的報文都發送完了,我才能 纔能發送FIN報文,因此不能一起發送。故需要四步握手。

2.TCP和UDP的區別?

TCP—傳輸控制協定,提供的是面向連接、可靠的位元組流服務。當客戶和伺服器彼此交換數據前,必須先在雙方之間建立一個TCP連線,之後才能 纔能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。
UDP—用戶數據報協定,是一個簡單的面向數據報的運輸層協定。UDP不提供可靠性,它只是把應用程式傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制 機製,故而傳輸速度很快

3.TCP和UDP的優缺點?

TCP缺點
三次握手四次揮手,傳輸更多包,浪費一些頻寬。
爲了進行可靠通訊,雙方都要維持線上,伺服器server可能出現非常大的併發連線,浪費了 系統資源,甚至會出現宕機。
確認重傳也會浪費一些頻寬,且在不好的網路中,會不斷的斷開和連線,降低了傳輸效率。
UDP優點
沒有握手,起步快延時小。
不需要維持雙方線上,server不用維護巨量併發連線,節省了系統資源。
沒有重傳機制 機製,在不影響使用的情況下,能更高效的利用網路頻寬。

4.爲什麼不能用兩次握手進行連線?

這主要是爲了防止已失效的連線請求報文段突然又傳到了B,因而產生錯誤
現假定一種異常情況,即A發出的第一個連線請求報文段並沒有丟失,而是在某些網路節點長時間滯留了,以致延誤到連線釋放後的某個時間纔到達B。本來這是一個早已失效的報文段。但B受到此失效的連線請求報文段後,就誤以爲是A又發出一次新的連線請求,於是就向A發出確認報文段,同意建立連線。假定不採用第三次報文握手,那麼只要B發出確認,新的連線就建立了。
由於現在A並沒有發出建立連線的請求,因此不會理睬B的確認,也不會向B發送數據,但B卻以爲新的運輸連線已經建立了,並一直等待A發來的數據。B的許多資源就這樣白白浪費了。
採用三次握手連線,可以防止上述現象的發生。例如在剛纔的異常情況下,A不會向B的確認發出確認,B由於收不到確認,就知道A並沒有要求建立連線,於是B就不會再建立連線。

5.如果已經建立了連線,但是用戶端突然出現故障了怎麼辦?

TCP還設有一個保活計時器,顯然,用戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次用戶端的請求後都會重新復位這個計時器,時間通常是設定爲2小時,若兩小時還沒有收到用戶端的任何數據,伺服器就會發送一個探測報文段,以後每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,伺服器就認爲用戶端出了故障,接着就關閉連線。

TCP通訊相關API

1.socket函數
函数解释

2.bind函數
bind函数描述
3.connect函數
在这里插入图片描述
4.listen函數
在这里插入图片描述
5.accept函數
在这里插入图片描述
6.shutdown函數
在这里插入图片描述
7.inet_pton函數
在这里插入图片描述
8.htons函數
在这里插入图片描述
9.inet_addr函數
在这里插入图片描述
10.send函數
在这里插入图片描述
11.recv函數
在这里插入图片描述

詳細案例

見下一篇部落格

  1. 本文僅使用者個人整理複習使用,部落格內容來自課堂及網路。 ↩︎

  2. (1)序號:seq序號,佔32位元,用來標識從TCP源端向目的端發送的位元組流,發起方發送數據時對 此進行標記。
    (2)確認序號:ack序號,佔32位元,只有ACK標誌位爲1時,確認序號欄位纔有效,ack=seq+1。
    (3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

    URG:緊急指針(urgent pointer)有效。
    ACK:確認序號有效。
    PSH:接收方應該儘快將這個報文交給應用層。
    RST:重置連線。
    SYN:發起一個新連線。
    FIN:釋放一個連線。
    需要注意:不要將確認序號ack與標誌位中的ACK搞混了;確認方ack=發起方req+1,兩端配對。 ↩︎