TCP相关的面试内容整理
以下內容源于網絡資料的學習整理。很多資料網上都有,但只有整理過一遍才屬于自己的。
參考博客
http://www.cnblogs.com/BlueTzar/articles/811160.html(OSI參考模型和TCP模型的詳解,包括格式)
https://blog.csdn.net/baidu_35692628/article/details/78255476?locationNum=4&fps=1(為什么可靠及優缺點)
https://blog.csdn.net/qzcsu/article/details/72861891(動圖很詳細,三次握手四次揮手過程)
https://blog.csdn.net/starsionblog/article/details/62040067(代碼實踐)
?
1、OSI參考模型和TCP模型
ISO制定的OSI參考模型的過于龐大復雜,招致了許多批評。(記憶:應、表示、會、傳輸、網絡,數據、物理)
與此對照,由技術人員自己開發的TCP/IP協議棧獲得了更為廣泛的應用。
? ? ?
在TCP/IP參考模型中,去掉了OSI參考模型中的會話層和表示層(這兩層的功能被合并到應用層實現)。同時將OSI參考模型中的數據鏈路層和物理層合并為主機到網絡層。
(1)主機到網絡層
實際上TCP/IP參考模型沒有真正描述這一層的實現,只是要求能夠提供給其上層-網絡互連層一個訪問接口,以便在其上傳遞IP分組。由于這一層次未被定義,所以其具體的實現方法將隨著網絡類型的不同而不同。
(2)網絡互連層
網絡互連層是整個TCP/IP協議棧的核心。它的功能是把分組發往目標網絡或主機。同時,為了盡快地發送分組,可能需要沿不同的路徑同時進行分組傳遞。因此,分組到達的順序和發送的順序可能不同,這就需要上層必須對分組進行排序。
網絡互連層定義了分組格式和協議,即IP協議(Internet Protocol)。
網絡互連層除了需要完成路由的功能外,也可以完成將不同類型的網絡(異構網)互連的任務。除此之外,網絡互連層還需要完成擁塞控制的功能。
(3)傳輸層
在TCP/IP模型中,傳輸層的功能是使源端主機和目標端主機上的對等實體可以進行會話。
在傳輸層定義了兩種服務質量不同的協議:傳輸控制協議TCP(transmission control protocol)、用戶數據報協議UDP(user datagram protocol)。
TCP協議是一個面向連接的、可靠的協議。它將一臺主機發出的字節流無差錯地發往互聯網上的其他主機。在發送端,它負責把上層傳送下來的字節流分成報文段并傳遞給下層。在接收端,它負責把收到的報文進行重組后遞交給上層。TCP協議還要處理端到端的流量控制,以避免緩慢接收的接收方沒有足夠的緩沖區接收發送方發送的大量數據。
UDP協議是一個不可靠的、無連接協議,主要適用于不需要對報文進行排序和流量控制的場合。
(4)應用層
TCP/IP模型將OSI參考模型中的會話層和表示層的功能合并到應用層實現。
應用層面向不同的網絡應用引入了不同的應用層協議。其中,有基于TCP協議的,如文件傳輸協議(File Transfer Protocol,FTP)、虛擬終端協議(TELNET)、超文本鏈接協議(Hyper Text Transfer Protocol,HTTP),也有基于UDP協議的。
?
2、簡述TCP為何可靠?
(1)確認和重傳機制
- 建立連接時三次握手來同步雙方的“序列號 + 確認號 + 窗口大小信息”,是確認重傳、流控的基礎。
- 傳輸過程中,如果Checksum校驗失敗、丟包或延時,發送端重傳。
(2)數據排序
- TCP有專門的序列號SN字段,可提供數據re-order。
(3)流量控制
- 滑動窗口和計時器的使用。TCP窗口中會指明雙方能夠發送接收的最大數據量。
(4)擁塞控制
- TCP的擁塞控制由4個核心算法組成:“慢啟動”(Slow Start),“擁塞避免”(Congestion avoidance),“快速重傳 ”(Fast Retransmit),“快速恢復”(Fast Recovery)。
?
3、簡述TCP和UDP的優缺點
(1)TCP缺點
- 三次握手四次揮手,傳輸更多包,浪費一些帶寬。
- 為了進行可靠通信,雙方都要維持在線,服務器server可能出現非常大的并發連接,浪費了系統資源,甚至會出現宕機。
- 確認重傳也會浪費一些帶寬,且在不好的網絡中,會不斷的斷開和連接,降低了傳輸效率。
(2)UDP優點
- 沒有握手,起步快延時小。
- 不需要維持雙方在線,server不用維護巨量并發連接,節省了系統資源。
- 沒有重傳機制,在不影響使用的情況下,能更高效的利用網絡帶寬。
?
4、簡述三次握手和四次握手
內容部分源于https://blog.csdn.net/qzcsu/article/details/72861891,很棒的一篇博文。
一些符號含義
(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,兩端配對。
(1)三次握手
最開始的時候客戶端和服務器都是處于CLOSED狀態。主動打開連接的為客戶端,被動打開連接的是服務器。
為什么TCP客戶端最后還要發送一次確認呢?
一句話,主要防止已經失效的連接請求報文突然又傳送到了服務器,從而產生錯誤。
如果使用的是兩次握手建立連接,假設有這樣一種場景,客戶端發送了第一個請求連接并且沒有丟失,只是因為在網絡結點中滯留的時間太長了,由于TCP的客戶端遲遲沒有收到確認報文,以為服務器沒有收到,此時重新向服務器發送這條報文,此后客戶端和服務器經過兩次握手完成連接,傳輸數據,然后關閉連接。此時此前滯留的那一次請求連接,網絡通暢了到達了服務器,這個報文本該是失效的,但是,兩次握手的機制將會讓客戶端和服務器再次建立連接,這將導致不必要的錯誤和資源的浪費。
如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文并且回復了確認報文,但是客戶端不會再次發出確認。由于服務器收不到確認,就知道客戶端并沒有請求連接。
?
(2)四次揮手
數據傳輸完畢后,雙方都可釋放連接。最開始的時候,客戶端和服務器都是處于ESTABLISHED狀態,然后客戶端主動關閉,服務器被動關閉。
為什么客戶端最后還要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允許不同的實現可以設置不同的MSL值。
第一,保證客戶端發送的最后一個ACK報文能夠到達服務器,因為這個ACK報文可能丟失,站在服務器的角度看來,我已經發送了FIN+ACK報文請求斷開了,客戶端還沒有給我回應,應該是我發送的請求斷開報文它沒有收到,于是服務器又會重新發送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接著給出回應報文,并且會重啟2MSL計時器。
第二,防止類似與“三次握手”中提到了的“已經失效的連接請求報文段”出現在本連接中。客戶端發送完最后一個確認報文后,在這個2MSL時間中,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失。這樣新的連接中不會出現舊連接的請求報文。
為什么建立連接是三次握手,關閉連接確是四次揮手呢?
建立連接的時候, 服務器在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。
而關閉連接時,服務器收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,而自己也未必全部數據都發送給對方了,所以己方可以立即關閉,也可以發送一些數據給對方后,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送,從而導致多了一次。
如果已經建立了連接,但是客戶端突然出現故障了怎么辦?
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接著就關閉連接。
?
總結
以上是生活随笔為你收集整理的TCP相关的面试内容整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse的java帮助文档_jav
- 下一篇: 1.ZooKeeper Java客户端的