上位機面試必備——TCP通訊靈魂二十問【上】

上位機面試必備——TCP通訊靈魂二十問【上】

TCP通訊協議應該是上位機開發中應用最廣泛的協議,無論是西門子S7協議、三菱MC協議或者是歐姆龍的Fins-TCP協議等,都是TCP通訊協議的典型應用。很多人在上位機面試時,都會被問到關於TCP通訊的一些問題,比如三次握手和四次揮手、TCP與Socket之間的聯絡等,為了便於大家更好地理解TCP通訊,我整理了一套關於TCP通訊的20個常見的面試題:

01

OSI參考模型與TCP/IP參考模型

上位機面試必備——TCP通訊靈魂二十問【上】

如上圖所示,OSI參考模型為7層模型,依次為應用層、表示層、會話層、傳輸層、網路層、資料鏈路層及物理層,TCP/IP模型是在OSI參考模型的基礎上做了一定的精簡,形成一個4層模型。在層次關係上,兩者都採用了分層體系結構,都是對等的層間通訊,不同之處在於TCP/IP參考模型比OSI參考模型層次更清晰簡練,在功能上,兩者差別不大,都是為了實現兩個或多個終端之間的通訊。

02

TCP通訊位於網路模型的哪一層?

TCP(Transmission Control Protocol)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,無論是OSI參考模型,還是TCP/IP參考模型,TCP都位於傳輸層,TCP是為了在不可靠的網際網路絡上提供可靠的端到端位元組流而專門設計的一個傳輸協議。

03

如何理解面向連線、可靠、位元組流?

面向連線:意味著TCP是點對點之間的通訊,不能像UDP那樣可以一個主機同時向多個主機發送訊息,也就是無法實現一對多的情形。

可靠的:無論網路鏈路如何變化,TCP都可以保障報文能夠到達接收端。

位元組流:基於位元組流,意味著無論我們訊息有多大都可以進行傳輸。並且訊息是有序的,當前一個訊息沒有收到的時候,即使它先收到了後面的位元組已經收到,那麼也不能扔給應用層去處理,同時對重複的報文會自動丟棄。

04

為什麼需要TCP協議?

因為IP層是不可靠的,它不保證網路包的一定交付、不保證按序交付、也不保證完整交付。因此如果需要保證網路資料包的可靠性,就必須要透過上層即傳輸層的TCP協議來保證。

05

TCP與UDP之間區別及聯絡?

TCP與UDP都屬於傳輸層協議,區別如下:

連線機制

TCP 是面向連線的傳輸層協議

UDP 是不需要連線

服務物件

TCP 是一對一的兩點服務

UDP 支援一對一、一對多、多對多

可靠性

TCP 保證資料不丟失、不重複、按需到達

UDP 是盡最大努力交付,不保證交付資料

擁塞控制、流量控制

TCP 有擁塞控制和流量控制機制

UDP 則沒有擁塞控制和流量控制機制

06

TCP首部報文分析

TCP的首部至少佔用20個位元組,包含的內容有源埠號、目標埠號、序列號、應答號、控制位、校驗和等,具體如下所示:

上位機面試必備——TCP通訊靈魂二十問【上】

07

簡要說明TCP三次握手

上位機面試必備——TCP通訊靈魂二十問【上】

伺服器與客戶端均處於CLOSE狀態

伺服器先主動監聽某埠,處理LISTEN狀態

客戶端傳送SYN報文,seq=x,SYN=1

伺服器回覆SYN+ACK報文,seq=y,ack=x+1,SYN=1,ACK=1

客戶端回覆ACK報文,ack=y+1,ACK=1

08

簡要說明TCP四次揮手

上位機面試必備——TCP通訊靈魂二十問【上】

伺服器與客戶端均處於ESTABLISHED狀態

客戶端打算關閉連線,傳送一個 FIN 報文,進入 FIN_WAIT_1 狀態。

服務端回覆 ACK報文,進入 CLOSED_WAIT 狀態。

客戶端收到 ACK 應答報文後,進入 FIN_WAIT_2 狀態。

服務端處理完資料後,向客戶端傳送 FIN 報文,進入 LAST_ACK 狀態。

客戶端回覆一個 ACK 應答報文,之後進入 TIME_WAIT 狀態

伺服器收到 ACK 應答報文後,進入了 CLOSE 狀態,服務端完成連線的關閉。

客戶端在經過 2MSL 一段時間後,自動進入 CLOSE 狀態,客戶端也完成連線的關閉。

09

TCP握手為什麼剛好是三次?

TCP 建立連線時,透過三次握手能防止歷史連線的建立,能減少雙方不必要的資源開銷,能幫助雙方同步初始化序列號。序列號能夠保證資料包不重複、不丟棄和按序傳輸。

不使用「兩次握手」和「四次握手」的原因:

兩次握手:無法防止歷史連線的建立,會造成雙方資源的浪費,也無法可靠的同步雙方序列號;

四次握手:三次握手就已經理論上最少可靠連線建立,所以不需要使用更多的通訊次數。

10

TCP揮手為什麼需要四次?

回顧下四次揮手雙方發 FIN 包的過程,就能理解為什麼揮手需要四次:

關閉連線時,客戶端向服務端傳送 FIN 時,僅僅表示客戶端不再發送資料了但是還能接收資料。

伺服器收到客戶端的 FIN 報文時,先回一個 ACK 應答報文,而服務端可能還有資料需要處理和傳送,等服務端不再發送資料時,才傳送 FIN 報文給客戶端來表示同意現在關閉連線。

由於服務端通常需要等待完成資料的傳送和處理,所以服務端的 ACK 和 FIN 一般都會分開發送,從而比三次握手導致多了一次。

我是新閣上位機付老師,用我的專業,成就你的夢想