亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

TCP 協(xié)議是我們每天都在使用的一個(gè)網(wǎng)絡(luò)通訊協(xié)議,因?yàn)榻^大部分的網(wǎng)絡(luò)連接都是建立在 TCP 協(xié)議上的,比如你此刻正在看的這篇文章是建立在 HTTP(Hypertext Transfer Protocol,超文本傳送協(xié)議) 應(yīng)用層協(xié)議的基礎(chǔ)上的,而 HTTP 協(xié)議的“底層”則是建立在 TCP 的傳輸層協(xié)議上的。因此可以理解為,你之所以能看到本篇文章就是得益于 TCP 協(xié)議的功勞。

我們本課時(shí)講的是,說(shuō)一下 TCP 三次握手的執(zhí)行流程,以及為什么需要三次握手?

典型回答

在回答這個(gè)問(wèn)題之前,首先我們需要搞清楚兩個(gè)概念,第一,什么是 TCP?第二,什么是 TCP 連接?只有搞明白了這兩個(gè)問(wèn)題,我們才能徹底搞懂為什么 TCP 需要三次握手?

什么是 TCP?

首先來(lái)說(shuō) TCP(Transmission Control Protocol,傳輸控制協(xié)議)是一個(gè)面向連接的、可靠的、基于字節(jié)流的傳輸層協(xié)議。從它的概念中我們可以看出 TCP 的三個(gè)特點(diǎn):面向連接、可靠性和面向字節(jié)流


 

TCP 的特點(diǎn)

面向連接:是指 TCP 是面向客戶端和服務(wù)器端連接的通訊協(xié)議,使用它可以將客戶端和服務(wù)器端進(jìn)行連接。

可靠性:是指無(wú)論網(wǎng)絡(luò)環(huán)境多差,TCP 都可以保證信息一定能夠傳遞到接收端。

TCP 之所以可以保證可靠性主要得益于兩個(gè)方面,一個(gè)是“狀態(tài)性”,另一個(gè)是“可控制性”。所謂狀態(tài)性是指 TCP 會(huì)記錄信息的發(fā)送狀態(tài),例如,哪些數(shù)據(jù)收到了、哪些數(shù)據(jù)沒(méi)收到等狀態(tài)信息都會(huì)被記錄;可控制性是指 TCP 會(huì)根據(jù)狀態(tài)情況控制自己的行為,比如當(dāng) TCP 意識(shí)到丟包了就會(huì)控制重發(fā)此包,這樣就實(shí)現(xiàn)了 TCP 的可靠性。

面向字節(jié)流:是指 TCP 是以字節(jié)流的方式進(jìn)行數(shù)據(jù)傳輸?shù)摹?/p>

RFC 793 對(duì) TCP 連接的定義如下:

 

Connections: The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream. The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.

 

小貼士: TCP 之所以被廣泛應(yīng)用,首先是因?yàn)樗且粋€(gè)標(biāo)準(zhǔn)化的協(xié)議,TCP 的標(biāo)準(zhǔn)協(xié)議就是由 RFC 793 定義的,它已經(jīng)有了 30 多年的歷史,并且已經(jīng)被多次更新。RFC(Request For Comments)是 IETF(Inte.NET Engineering Task Force)的正式文檔。IETF 是一家制定互聯(lián)網(wǎng)標(biāo)準(zhǔn)的組織,它制定了 Internet(互聯(lián)網(wǎng))的整體協(xié)議體系,凡是經(jīng)過(guò) IETF 評(píng)審認(rèn)可的標(biāo)準(zhǔn)都會(huì)被發(fā)布為帶編號(hào)的 RFC 的文檔。

TCP 定義的大致意思是,用于保證可靠性和流控制機(jī)制的信息,包括 Socket、序列號(hào)及窗口大小被稱為連接。

其中,Socket 是由 IP 地址加端口號(hào)組成的,序列號(hào)是用來(lái)解決亂序問(wèn)題的,而窗口大小則是用來(lái)做流量控制的。

TCP 三次握手的執(zhí)行流程

接下來(lái)我們來(lái)看 TCP 三次握手的執(zhí)行流程,如下圖所示:


 

關(guān)鍵字說(shuō)明:

 

  • SYN(SYNchronize Sequence Numbers),同步序列編號(hào);
  • ACK(Acknowledge Character),確認(rèn)字符;
  • SEQ(Sequence Number),序列號(hào)。

 

TCP 的執(zhí)行流程如下:

 

  • 最開始時(shí)客戶端和服務(wù)端都處于 CLOSED 狀態(tài),然后服務(wù)端先主動(dòng)監(jiān)聽某個(gè)端口,此時(shí)服務(wù)器端就變成了 LISTEN(監(jiān)聽)狀態(tài);
  • 然后客戶端主動(dòng)發(fā)起連接,發(fā)送 SYN(同步序列編號(hào)),此時(shí)客戶端就變成了 SYN-SENT 狀態(tài);
  • 服務(wù)端接收到信息之后返回 SYN 和 ACK 至客戶端,此時(shí)服務(wù)器端就變成了 SYN-REVD 狀態(tài);

 

客戶端接收到消息之后,再發(fā)送 ACK 至服務(wù)器端,此時(shí)客戶端就變成了 ESTABLISHED(已確認(rèn))狀態(tài),服務(wù)端收到 ACK 之后,也變成了 ESTABLISHED 狀態(tài),此時(shí)連接工作就執(zhí)行完了。

為什么 TCP 需要三次握手?

了解了以上 TCP 的基礎(chǔ)概念之后,我們?cè)賮?lái)看一下 TCP 為什么需要三次握手?

原因一:防止重復(fù)連接

首先來(lái)說(shuō) RFC 793 - Transmission Control Protocol 其實(shí)就指出了三次握手的主要原因,它的描述如下:

 

The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

 

翻譯為中文的意思是,三次握手的主要原因是為了防止舊的重復(fù)連接引起連接混亂問(wèn)題。

比如在網(wǎng)絡(luò)狀況比較復(fù)雜或者網(wǎng)絡(luò)狀況比較差的情況下,發(fā)送方可能會(huì)連續(xù)發(fā)送多次建立連接的請(qǐng)求。如果 TCP 握手的次數(shù)只有兩次,那么接收方只能選擇接受請(qǐng)求或者拒絕接受請(qǐng)求,但它并不清楚這次的請(qǐng)求是正常的請(qǐng)求,還是由于網(wǎng)絡(luò)環(huán)境問(wèn)題而導(dǎo)致的過(guò)期請(qǐng)求,如果是過(guò)期請(qǐng)求的話就會(huì)造成錯(cuò)誤的連接。

所以如果 TCP 是三次握手的話,那么客戶端在接收到服務(wù)器端 SEQ+1 的消息之后,就可以判斷當(dāng)前的連接是否為歷史連接,如果判斷為歷史連接的話就會(huì)發(fā)送終止報(bào)文(RST)給服務(wù)器端終止連接;如果判斷當(dāng)前連接不是歷史連接的話就會(huì)發(fā)送指令給服務(wù)器端來(lái)建立連接。

原因二:同步初始化序列化

通過(guò)上面的概念我們知道 TCP 的一個(gè)重要特征就是可靠性,而 TCP 為了保證在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中構(gòu)建一個(gè)穩(wěn)定的數(shù)據(jù)連接,它就需要一個(gè)“序列號(hào)”字段來(lái)保證自己的穩(wěn)定性,而這個(gè)序列號(hào)的作用就是防止數(shù)據(jù)包重復(fù)發(fā)送,以及有效的解決數(shù)據(jù)包接收時(shí)順序顛倒的問(wèn)題。

那么在建立 TCP 連接時(shí)就需要同步初始化一個(gè)序列號(hào)來(lái)保證 TCP 的穩(wěn)定性,因此它需要執(zhí)行以下過(guò)程:

 

  • 首先客戶端發(fā)送一個(gè)攜帶了初始序列號(hào)的 SYN 報(bào)文給服務(wù)器端;
  • 服務(wù)端接收到消息之后會(huì)回復(fù)一個(gè) ACK 的應(yīng)答報(bào)文,表示客戶端的 SYN 報(bào)文已被服務(wù)端成功接收了;
  • 而客戶端收到消息之后也會(huì)發(fā)送一個(gè) ACK 給服務(wù)端,服務(wù)器端拿到這個(gè)消息之后,我們就可以得到一個(gè)可靠的初始化序列號(hào)了。

 

而如果是兩次握手的話,就無(wú)法進(jìn)行序列號(hào)的確認(rèn)工作了,因此也就無(wú)法得到一個(gè)可靠的序列號(hào)了,所以 TCP 連接至少需要三次握手。

以上兩種原因就是 TCP 連接為什么需要三次握手的主要原因,當(dāng)然 TCP 連接還可以四次握手,甚至是五次握手,也能實(shí)現(xiàn) TCP 連接的穩(wěn)定性,但三次握手是最節(jié)省資源的連接方式,因此 TCP 連接應(yīng)該為三次握手。

考點(diǎn)分析

TCP 知識(shí)是計(jì)算機(jī)編程基礎(chǔ),也是面試中常見的面試問(wèn)題,因?yàn)槲覀儸F(xiàn)在所使用的大部分連接都是建立在 TCP 基礎(chǔ)上的。因此對(duì) TCP 的掌握可以讓我們更清楚地理解技術(shù)的實(shí)現(xiàn)過(guò)程,也能幫我們寫出更加優(yōu)秀的代碼,以及排查一些和網(wǎng)絡(luò)相關(guān)的問(wèn)題。

和此知識(shí)點(diǎn)相關(guān)的面試題還有以下這些:

 

  • 什么是 UDP?
  • TCP 和 UDP 有什么區(qū)別?
知識(shí)擴(kuò)展 UDP 介紹

 

UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是無(wú)連接的、簡(jiǎn)單的、面向數(shù)據(jù)報(bào)的傳輸層協(xié)議。也就是 UDP 在發(fā)送數(shù)據(jù)之前,無(wú)須建立客戶端與服務(wù)端的連接,直接發(fā)送消息即可。

UDP 的協(xié)議頭有 8 個(gè)字節(jié)(64 位),如下圖所示:


 

其中源端口和目標(biāo)端口是指記錄發(fā)送方和接收方端口;UDP 包長(zhǎng)度是指 UDP 頭部加上 UDP 數(shù)據(jù)的總長(zhǎng)度;UDP 校驗(yàn)和用于效驗(yàn) UDP 的內(nèi)容是否可靠。

UDP 常見的使用場(chǎng)景有:語(yǔ)音、視頻等多媒體通信、DNS(域名轉(zhuǎn)化)、TFTP 等。

TCP VS UDP

TCP 和 UDP 的區(qū)別主要體現(xiàn)在以下 7 個(gè)方面:

 

  • 可靠性,TCP 有“狀態(tài)性”和“可控制性”可以保證消息不重復(fù)、按順序、不丟失的發(fā)送和接收,而 UDP 則不能保證消息的可靠性;
  • 連接,TCP 是面向連接的傳輸層協(xié)議,傳輸數(shù)據(jù)前先要建立連接,而 UDP 發(fā)送數(shù)據(jù)之前無(wú)需建立連接;
  • 服務(wù)對(duì)象,TCP 服務(wù)的對(duì)象為一對(duì)一的雙端應(yīng)用,而 UDP 可以應(yīng)用于一對(duì)一、一對(duì)多和多對(duì)多的通信場(chǎng)景;
  • 效率,TCP 的傳輸效率較低,而 UDP 的傳輸效率較 高;
  • 流量控制,TCP 有滑動(dòng)窗口可以用來(lái)控制流量,而 UDP 則不具備流量控制的能力;
  • 報(bào)文,TCP 是面向字節(jié)流的傳輸層協(xié)議,而 UDP 是面向報(bào)文的傳輸層協(xié)議;
  • 應(yīng)用場(chǎng)景,TCP 的應(yīng)用場(chǎng)景是對(duì)消息準(zhǔn)確性和順序要求較高的場(chǎng)景,而 UDP 則是應(yīng)用于對(duì)通信效率較高、準(zhǔn)確性要求相對(duì)較低的場(chǎng)景。

 

TCP 和 UDP 的使用場(chǎng)景如下圖所示:


 

小結(jié)

本課時(shí)我們介紹了 TCP 三個(gè)特點(diǎn):面向連接、可靠性和面向字節(jié)流,其中可靠性主要是依賴它的狀態(tài)記錄和根據(jù)實(shí)際情況調(diào)整自身的行為方式。例如,當(dāng) TCP 意識(shí)到丟包時(shí)就會(huì)重發(fā)此包,這樣就保證了通信的可靠性。

TCP 之所以需要三次握手的主要原因是為了防止在網(wǎng)絡(luò)環(huán)境比較差的情況下不會(huì)進(jìn)行無(wú)效的連接,同時(shí)三次握手可以實(shí)現(xiàn) TCP 初始化序列號(hào)的確認(rèn)工作,TCP 需要初始化一個(gè)序列號(hào)來(lái)保證消息的順序。如果是兩次握手則不能確認(rèn)序列號(hào)是否正常,如果是四次握手的話會(huì)浪費(fèi)系統(tǒng)的資源,因此 TCP 三次握手是最優(yōu)的解決方案,所以 TCP 連接需要三次握手。

最后我們講了 UDP 的概念,以及 UDP 和 TCP 的區(qū)別,在傳輸效率要求比較高且對(duì)可靠性要求不高的情況下可以使用 UDP,反之則應(yīng)該使用 TCP。

分享到:
標(biāo)簽:TCP
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定