1. 程式人生 > >【Java面試題】之三次握手和四次揮手

【Java面試題】之三次握手和四次揮手

本文內容大部分轉載自:http://blog.csdn.net/whuslei/article/details/6667471/

原文獲得了54萬的閱讀量,說明改文章的質量很高

同時,博主在原文的基礎上也補充了一些內容

建立TCP需要三次握手才能建立,而斷開連線則需要四次握手。整個過程如下圖所示:

先來看看如何建立連線的。

【更新於2017.01.04 】該部分內容配圖有誤,請大家見諒,正確的配圖如下,錯誤配圖也不刪了,大家可以比較下,對比理解效果更好。這麼久才來更新,抱歉!!

錯誤配圖如下:

首先Client端傳送連線請求報文,Server段接受連線後回覆ACK報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP連線就建立了。(注意:第二次客戶端的SYN標誌位為0

這裡補充一下,為什麼客戶機還要再發送一次確認呢?

答:這主要是為了防止以失效的連結請求報文段突然又傳送到了服務端,因而產生了錯誤。

所謂“已失效的連線請求報文段”是這樣產生的。

考慮一種情況。客戶端發出連線請求,但因為連線請求丟失而未收到確認。於是客戶端會再重傳一次連線請求。

後來收到了確認,建立了連線。

資料傳輸完畢後,就釋放了連線。客戶端一共傳送了兩個連線請求報文段,其中第一個丟失,第二個到達了服務端。沒有“已失效的連線請求報文段”。

現在假定一種異常情況,即客戶端發出的第一個連線請求報文段並沒有丟失,而是在某些網路節點長時間滯留了,以致延誤到連線釋放以後的某個時間才到達服務端。

本來這是一個早已失效的請求報文段。但服務端收到此失效的連線請求報文段後,就誤以為客戶端又發出了一次連線請求。

於是向A發出確認報文段,同意建立連線。

假定不採用三次握手,那麼只要服務端發出確認,新的連線就建立了。這顯然是不行的。

由於現在客戶端並沒有發出建立連線的請求,因此不會理睬服務端的確認,也不會向服務端傳送資料。

但是服務端卻以為新的傳輸連線已經建立,並一直等待客戶端發來的資料。服務端的許多資源就是這樣白白浪費了

那如何斷開連線呢?簡單的過程如下:


【注意】中斷連線端可以是Client端,也可以是Server端。

假設Client端發起中斷連線請求,也就是傳送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有資料要發給你了

",但是如果你還有資料沒有傳送完成,則不必急著關閉Socket,可以繼續傳送資料。所以你先發送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的訊息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定資料已傳送完成,則向Client端傳送FIN報文,"告訴Client端,好了,我這邊資料發完了,準備好關閉連線了"。Client端收到FIN報文後,"就知道可以關閉連線了,但是他還是不相信網路,怕Server端不知道要關閉,所以傳送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK後,"就知道可以斷開連線了"。Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,我Client端也可以關閉連線了。Ok,TCP連線就這樣關閉了!

整個過程Client端所經歷的狀態如下:



【注意】 在TIME_WAIT狀態中,如果TCP client端最後一次傳送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連線正式關閉,並且所有的資源(包括埠號)都被釋放。

【問題1】為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
答:因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。

【問題2】為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網路是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。


相關推薦

Java試題握手揮手

本文內容大部分轉載自:http://blog.csdn.net/whuslei/article/details/6667471/ 原文獲得了54萬的閱讀量,說明改文章的質量很高 同時,博主在原文的基礎上也補充了一些內容 建立TCP需要三次握手才能建立,而斷開連線則需要

Java試題分頁功能的實現

以下內容是根據網上內容以及傳智播客教學整理而來,侵刪。 分頁的實現可分為兩大類:一、資料在Java程式碼中進行分頁,然後取得當前頁資料;二、在資料庫中直接取得當前頁資料。通常面試官都希望聽到後者,因為那才是高效的方法。你如果想讓面試官覺得你的能力高的話你就先否定他的問

Java試題Object類中方法詳解

之前看到有人分享的面經,面試官先問Object中有什麼方法,然後再要求解釋每一次方法的作用。 先看看Object中有什麼方法 Object類是Java中所有類的基類。位於java.lang包中,一共有13個方法 方法一 Object() 即Object的構造方法 大

Java試題完整的Http請求過程(非常詳細)

④ 如果在hosts檔案中也沒有找到對應的條目,瀏覽器就會發起一個DNS的系統呼叫,就會向本地配置的首選DNS伺服器(本地DNS伺服器,一般是電信運營商提供的,也可以使用像Google提供的DNS伺服器)發起域名解析請求(遞迴,通過的是UDP協議向DNS的53埠發起請求,這個請求是遞迴的請求,也就是運營商的D

Java試題之類載入:從試題分析Java類載入機制

 “載入”(Loading)階段是“類載入”(Class Loading)過程的第一個階段,在此階段,虛擬機器需要完成以下三件事情:        1、 通過一個類的全限定名來獲取定義此類的二進位制位元組流。        2、 將這個位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結

Java試題spring+springMVC+mybatis原理及實現機制(持續更新)

本文將持續更新,主要講解SSM框架的底層原理和實現機制等 1.什麼是IOC? IOC即Inverse of Control,它包括兩個內容:控制與反轉 那到底什麼東西的“控制”被“反轉”了呢?對於軟體而言,即是某一個介面具體實現類的選擇控制權從呼叫類中移除,轉交給第三

java試題Static Nested Class(巢狀類) Inner Class(內部類)的不同 、final、static

前言: 本來是想總結一下inner class 的用法,但是卻發現這幾位頗為親近。索性一起拉出來溜溜。 寫作目的: 跟 static , final, inner class 搞好關係,以便將來遇見了,就像用if ,else一樣,一清二楚。 文中的術語定義以java language spec為準。 先想想

Java試題11 什麼是內部類?Static Nested Class Inner Class的不同。

Inner Class(內部類)定義在類中的類。 (一般是JAVA的說法) Nested Class(巢狀類)是靜態(static)內部類。(一般是C++的說法) 靜態內部類:1 建立一個static內部類的物件,不需要一個外部類物件2 不能從一個static內部類的一

Anonymous Inner Class(匿名內部類)是否可以繼承其它類?是否可以實現介面?Java試題

回答:匿名內部類在實現時必須藉助一個藉口或者一個抽象類或者一個普通類來構造,從這過層次上講匿名內部類是實現了介面或者繼承了類,但是不能通過extends或implement關鍵詞來繼承類或實現介面。

抽象類(abstract class)介面(interface)有什麼異同?Java試題

1、抽象類可以包含非抽象的方法,而介面中的方法必須是抽象的。 2、繼承抽象類在Java語言體系中體現一種繼承關係,在合理的繼承關係中,父類和派生類比如按存在is-a關係。而實現介面則體現一種has-a

Java試題如何回答GC相關問題

一個面試官對面試問題的分析 這個帖子的背景是今晚看到je上這張貼:大家都來說說自己最討厭的面試題目吧。,心血來潮寫下的文字,如果能拋磚引玉,能有其他面試官分析一下自己面試時問的問題,那或許是件很有意義的事情。 在公司當技術面試官幾年間,從應屆生到工作十幾年的應聘者都遇到過。先表達一下我自己對面試的觀點:

Java試題對於構造方法的疑問?——與類的初始化

一,疑問從學習java至今,我一直對構造方法存在很多疑問,在此將我的疑問throw,你們可以catch到嗎?面試官 :你說下構造方法吧!我 :((⊙o⊙)… ,構造方法有什麼聊的,物件的new不是一直在用嗎?) 構造方法是一種特殊的方法,它是一個與類同名且沒有

Java試題抽象類是否可繼承實體類

一道java 常見面試題,網上找到的幾乎每個 java 面試筆試題大全或集錦裡都能找到這道題。 題目如下: 問: 抽象類是否可繼承實體類 (concrete class) 答: 抽象類是可以繼承實體類,但前提是實體類必須有明確的建構函式 答案很明確,可以繼承。其實從Ob

Java試題springMVC的原理?

1.客戶端傳送一個Http請求給Web伺服器,Web伺服器對請求進行解析,如果匹配到DispatcherServlet請求對映路徑,Web容器將請求轉交給DispatcherServlet。 2.Dispatcher接受到請求後,根據請求資訊以及HandlerMappe

Java試題List如何一邊遍歷,一邊刪除?

這是最近面試時被問到的1道面試題,本篇部落格對此問題進行總結分享。 ## 1. 新手常犯的錯誤 可能很多新手(包括當年的我,哈哈)第一時間想到的寫法是下面這樣的: ```java public static void main(String[] args) { List platformList

TCP握手揮手

prot 說明 的確 應用程序 二次 負責 序列 簡單網絡管理 igmp 一. TCP/IP協議族 TCP/IP是一個協議族,通常分不同層次進行開發,每個層次負責不同的通信功能。包含以下四個層次: 1. 鏈路層,也稱作數據鏈路層或者網絡接口層

計算機網路TCP如何講清楚Tcp的握手揮手

每一次TCP連線都需要三個階段:連線建立、資料傳送和連線釋放。 三次握手: 三次握手就發生在連線建立階段。 目的:三次握手的目的是為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產

計算機網路為什麼TCP需要握手揮手

TCP協議是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,採用全雙工通訊。 那為什麼需要三次握手呢?請看如下的過程: A向B發起建立連線請求:A——>B; B收到A的傳送訊號,並且向A傳送確認資訊:B——>A; A收到B的確認訊號,並向B傳送確認訊

網路TCP通訊協議裡面的握手揮手的流程!!

伺服器初始化的一般過程: 呼叫socket 函式獲取建立的檔案描述符 使用bind函式對IP和port進行繫結 呼叫listen函式監聽socket建立的檔案描述符 呼叫accept函式對客戶端進行

Java併發程式設計六:RunnableThread實現多執行緒的區別(含程式碼)

    Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Th