一,TCP與UDP的基本總結
TCP(傳輸控制協議)和UDP(使用者資料包協議)是兩種主要的傳輸層協議。TCP是面向連線的,提供可靠、順序的傳輸,適用於需要高可靠性的應用,如網頁瀏覽和檔案傳輸。它透過重傳機制和流量控制確保資料完整性。UDP是無連線的,速度快但不保證資料的可靠性和順序,適用於對實時性要求高的應用,如影片流和線上遊戲。TCP在資料傳輸前建立連線,進行資料確認和重傳,而UDP則簡單直接,不進行連線建立或確認。
二、何種情況下connect會阻塞
TCP 三次握手過程中:在客戶端呼叫 connect() 函式後,TCP 連線的建立需要經過三次握手過程。在這個過程中,如果伺服器沒有響應或者響應延遲,客戶端的 connect() 函式會一直阻塞等待直到連線建立成功或者超時。
非阻塞套接字設定:如果將套接字設定為非阻塞模式,即在呼叫 connect() 前透過 fcntl() 函式設定了 O_NONBLOCK 標誌,那麼 connect() 將會立即返回,無論連線是否建立成功。在這種情況下,可以透過 select()、poll() 或 epoll() 等函式來檢查連線是否建立成功,或者設定超時時間來控制連線操作。呼叫read的時候不堵塞(read(套接字,陣列,陣列大小);
目標地址不可達或網路問題:如果目標地址不可達、網路問題或者伺服器端未處於監聽狀態,connect() 也會阻塞等待直到超時。
連線佇列已滿:在客戶端與伺服器建立連線時,伺服器會維護一個連線佇列來接受客戶端的連線請求。如果連線佇列已滿,客戶端的 connect() 呼叫將會阻塞,直到伺服器接受了新的連線或連線超時。
三、TCP連線特性--- 三次握手,四次揮手
自導自演協議
三次握手:
第一次握手:客戶端傳送連線請求
第二次握手:伺服器回應收到客戶端的連線請求,並且告訴客戶端可以連線
第三次握手:客戶端回應伺服器我收到你讓我能連線的訊息了
開始連線
本次傳送的序列號seq是上一次的確認號ack 本次傳送的ack是上一次的seq+1
四次揮手:
第一次揮手:客戶端傳送斷開連線請求
第二次揮手:伺服器回應客戶端收到了斷開連線的請求,準備斷開
第三次揮手:伺服器回應客戶端準備好了,可以斷開
第四次揮手:客戶端回應伺服器收到可以斷開的請求
開始斷開
四、常見的伺服器IO(傳送資料+接收資料)模型
阻塞式IO模型(Blocking IO Model):在這種模型中,當應用程式呼叫IO操作時,它會被阻塞,直到操作完成並返回結果。這意味著在等待IO操作完成的同時,應用程式無法執行其他任務。這種模型最適合於對實時性要求不高的應用程式。
非阻塞式IO模型(Non-Blocking IO Model):在這種模型中,應用程式IO操作和多路複用的時候會會立即返回,而不會等待IO操作完成。如果操作沒有立即完成,則應用程式將繼續執行其他任務。應用程式需要重複執行輪詢操作來檢查IO操作是否完成。這種模型適用於需要高實時性的應用程式。
IO複用模型(IO Multiplexing Model):在這種模型中,應用程式使用非阻塞IO操作向多個socket發起請求,並使用select()或poll()等系統呼叫來等待其中任何一個socket上的IO操作完成。當某個socket上的IO操作完成時,應用程式會收到通知並處理相應的IO事件。這種模型適用於需要同時處理多個socket連線的應用程式。
非同步IO模型(Asynchronous IO Model):在這種模型中,當應用程式發起IO操作時,它會立即返回,並繼續執行其他任務。當IO操作完成時,應用程式會收到通知並處理相應的IO事件。這種模型適用於需要同時處理多個IO操作的高併發應用程式。