成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從TCP協(xié)議到TCP通信的各種異常現(xiàn)象和分析(下)

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
今天我們繼續(xù)介紹關(guān)于TCP異常情況的內(nèi)容,本篇文章重點(diǎn)介紹的是在數(shù)據(jù)傳輸過程中的各種異常,以及出現(xiàn)異常后的TCP連接的情況。

今天我們繼續(xù)介紹關(guān)于TCP異常情況的內(nèi)容。本篇文章接著上一篇文章,前面分析了在連接過程中的各種異常,本篇文章重點(diǎn)介紹的是在數(shù)據(jù)傳輸過程中的各種異常,以及出現(xiàn)異常后的TCP連接的情況。為了便于大家理解本文,這里我們將上一篇文章的前半部分內(nèi)容拷貝到這里,這部分內(nèi)容主要介紹協(xié)議的內(nèi)容。

下圖是網(wǎng)絡(luò)通信中常見的架構(gòu),也就是CS架構(gòu)。其中程序包括兩部分,分別為客戶端(Client)和服務(wù)端(Server)。當(dāng)然,實(shí)際的環(huán)境還要復(fù)雜的多,在客戶端和服務(wù)端之間可能有多種不同種類和數(shù)量的設(shè)備,這些設(shè)備都會(huì)增加網(wǎng)絡(luò)通信的復(fù)雜性。自然,也會(huì)增加程序開發(fā)容錯(cuò)的復(fù)雜性。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

圖1 基本架構(gòu)

一、TCP的基本流程

在分析異常情況之前,我們先回憶一下TCP協(xié)議的基本邏輯。在客戶端和服務(wù)端能夠收發(fā)數(shù)據(jù)之前首先必需建立連接。連接的建立在協(xié)議層面也是通過收發(fā)數(shù)據(jù)包完成,只不過在用戶層面就是客戶端調(diào)用了一個(gè)connect函數(shù)。連接的過程俗稱“三次握手”,具體流程如圖2所示。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

圖2 TCP的三次握手流程

TCP連接的斷開也是比較復(fù)雜的,需要經(jīng)過所謂的“四次揮手”的流程。其原因是因?yàn)門CP是雙工通信,分別需要從客戶端和服務(wù)端2側(cè)斷開連接。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

圖3 TCP的四次揮手

另外一個(gè)比較重要的內(nèi)容是TCP協(xié)議的狀態(tài)轉(zhuǎn)換,理解了這個(gè)內(nèi)容,我們才能清楚出現(xiàn)各種異常情況下數(shù)據(jù)包的內(nèi)容。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

圖4 TCP狀態(tài)轉(zhuǎn)換圖

本文只是簡單回憶一下TCP的基本流程,詳細(xì)的內(nèi)容可以參考本號之前的文章《從TCP到Socket,徹底理解網(wǎng)絡(luò)編程是怎么回事

二、異常情況分析

本文的分析假設(shè)連接已經(jīng)建立,目前正在數(shù)據(jù)收發(fā)過程。這種情況下會(huì)出現(xiàn)各種異常,比如服務(wù)器宕機(jī)、進(jìn)程crash或者進(jìn)程被kill等等。下面我們分別介紹上述集中情況在TCP通信中的表現(xiàn)。

1. 服務(wù)進(jìn)程crash

服務(wù)進(jìn)程crash恐怕是我們?nèi)粘I森h(huán)境最長遇到的情況,沒有之一吧。那么在這種情況下客戶端軟件是什么反應(yīng)?客戶端是否可以感知?

我們分別寫客戶端和服務(wù)端的程序,客戶端不斷的發(fā)送數(shù)據(jù),服務(wù)端接收數(shù)據(jù)。異常的模擬很簡單,我們可以在服務(wù)端制造一個(gè)指針訪問異常。此時(shí)服務(wù)端的程序就會(huì)crash掉。然后我們觀察客戶端的表現(xiàn)。先上結(jié)果,客戶端的表現(xiàn)如下圖所示。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

可以看到客戶端被reset掉了。我們在結(jié)合通過wireshark抓獲的此時(shí)的數(shù)據(jù)報(bào)文內(nèi)容,可以看到是一個(gè)RST報(bào)文。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

回憶一下什么情況下服務(wù)端會(huì)發(fā)送RST報(bào)文。這種場景跟我們前文介紹的服務(wù)端沒有監(jiān)聽的情況是類似的。由于服務(wù)端程序crash了,此時(shí)在操作系統(tǒng)中的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)已經(jīng)被釋放,因此在協(xié)議層收到數(shù)據(jù)包的時(shí)候無法找到對應(yīng)的套接字進(jìn)行處理,于是發(fā)送了一個(gè)RST報(bào)文。

2. 手動(dòng)殺死服務(wù)端應(yīng)用

這也是線上比較常見的操作,當(dāng)一個(gè)模塊上線時(shí),ops同學(xué)總是會(huì)先把舊的進(jìn)程殺死,然后再啟動(dòng)新的進(jìn)程。那么在這個(gè)過程中TCP連接又會(huì)發(fā)生了什么呢?是否會(huì)像上一種情況一樣被RST呢?同樣,我們先看一下結(jié)果,如下是客戶端的情況。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

從上面錯(cuò)誤碼來看是管道破裂,其實(shí)也就是連接被中斷了。我們再看一下通過wireshark的抓包結(jié)果可以看出服務(wù)端發(fā)送了一個(gè)FIN報(bào)文,這個(gè)報(bào)文表示服務(wù)端發(fā)起了關(guān)閉的請求。而接下來的一個(gè)報(bào)文是客戶端對該請求的確認(rèn)。

理解了這些異常現(xiàn)象才敢說真正懂了TCP協(xié)議(下)

所以,從上面客戶端的錯(cuò)誤碼和報(bào)文情況我們可以知道,在kill進(jìn)程時(shí)TCP協(xié)議是能夠感知到的,并且發(fā)送的FIN報(bào)文。

我們再進(jìn)一步的思考一下,為什么kill進(jìn)程會(huì)有FIN呢?這個(gè)與前面crash的差異在哪?其實(shí)kill進(jìn)程是通過shell想內(nèi)核發(fā)送了SIGKILL或者SIGTERM,內(nèi)核接收到該信號之后會(huì)進(jìn)行相應(yīng)的掃尾工作,因此可以看到服務(wù)端發(fā)送了FIN報(bào)文。

3. Server進(jìn)程所在的主機(jī)關(guān)機(jī)

主機(jī)關(guān)機(jī)(這里指手動(dòng)關(guān)機(jī))的情況與進(jìn)程被kill是類似的。這時(shí)因?yàn)樵谙到y(tǒng)關(guān)閉時(shí),init進(jìn)程會(huì)給所有進(jìn)程發(fā)送SIGTERM信號,等待一段時(shí)間(5~20秒),然后再給所有仍在運(yùn)行的進(jìn)程發(fā)送SIGKILL信號。當(dāng)服務(wù)器進(jìn)程死掉時(shí),會(huì)關(guān)閉所有文件描述符。帶來的影響和上面殺死server相同。

4. Server進(jìn)程所在的主機(jī)宕機(jī)

這是我們線上另一種比較常見的狀況。即使宕機(jī)是一個(gè)小概率事件,線上幾千臺服務(wù)器動(dòng)不動(dòng)一兩臺掛掉也是常有的事。這里掛掉其實(shí)包括2種情況,一種是內(nèi)核panic,另外一種情況是出現(xiàn)了掉電。對于內(nèi)核panic的情況不會(huì)像關(guān)機(jī)那樣會(huì)預(yù)先殺死上面的進(jìn)程,而是突然性的。那么此時(shí)我們的客戶端準(zhǔn)備給服務(wù)器端發(fā)送一個(gè)請求,它由write寫入內(nèi)核,由TCP作為一個(gè)報(bào)文發(fā)出,但因?yàn)橹鳈C(jī)已經(jīng)掛掉,因此客戶端無法收到ACK。于是客戶端TCP持續(xù)重傳分節(jié),試圖從服務(wù)器上接收一個(gè)ACK,然而服務(wù)器始終不能應(yīng)答,重傳數(shù)次之后,大約幾分鐘才停止,之后返回一個(gè)ETIMEDOUT錯(cuò)誤。在這種情況下,如果我們調(diào)用的是同步發(fā)送接口,則在發(fā)送緩沖區(qū)慢的情況下會(huì)阻塞在這里,導(dǎo)致程序阻塞。

這個(gè)時(shí)間真的很長,對于某些應(yīng)用這種長時(shí)間的卡頓是不能接受的。因此,需要一種手段處理這種情況,在套接字接口中可以通過SO_SNDTIMEO標(biāo)記進(jìn)行設(shè)置。但是有利也有弊,如果設(shè)置了該參數(shù),可能會(huì)出現(xiàn)這的數(shù)據(jù)發(fā)送超時(shí)的情況,進(jìn)而出現(xiàn)向服務(wù)端發(fā)送重復(fù)數(shù)據(jù)的情況,此時(shí)需要服務(wù)端做去重處理。

5. 服務(wù)器進(jìn)程所在的主機(jī)宕機(jī)后重啟

在客戶端發(fā)出請求前,服務(wù)器端主機(jī)經(jīng)歷了宕機(jī)—重啟的過程。當(dāng)客戶端TCP把分節(jié)發(fā)送到服務(wù)器端所在的主機(jī),服務(wù)器端所在主機(jī)的TCP丟失了崩潰前所有連接信息,即TCP收到了一個(gè)根本不存在連接上(也就是我們前文介紹的查找不到socket數(shù)據(jù)結(jié)構(gòu))的報(bào)文,所以會(huì)響應(yīng)一個(gè)RST分節(jié)。

至此,關(guān)于TCP協(xié)議中各種異常情況介紹完了,詳細(xì)了解這些內(nèi)容后對后續(xù)線上問題的分析和解決會(huì)有很大的幫助。當(dāng)然,也有可能還有其它本文沒有介紹到的異常情況,也歡迎大家留言交流。

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2019-05-16 15:19:40

TCP協(xié)議TCP通信三次握手

2019-05-17 09:02:19

TCP協(xié)議服務(wù)端

2019-05-28 09:40:39

TCP協(xié)議socket接口

2018-12-03 05:54:48

Wireshark網(wǎng)絡(luò)協(xié)議TCP

2010-03-09 14:10:13

Python循環(huán)語句

2010-06-08 14:43:48

2010-06-12 15:41:29

TCP IP通信協(xié)議

2017-10-25 20:52:03

內(nèi)核權(quán)限空指針異常

2010-06-12 15:54:09

TCP IP協(xié)議

2010-02-23 18:05:40

WCF異常現(xiàn)象

2017-08-16 11:00:38

TCPIP協(xié)議

2019-04-29 10:26:49

TCP網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)通信

2019-03-12 10:46:17

TCP協(xié)議算法

2010-06-09 14:42:21

UDP協(xié)議TCP協(xié)議

2010-06-09 11:38:37

傳輸層通信協(xié)議

2010-07-06 15:50:12

TCP和UDP協(xié)議

2010-06-13 15:32:57

TCP協(xié)議

2013-05-27 10:48:16

TCPUDP傳輸協(xié)議

2010-09-27 13:25:58

TCP IP協(xié)議棧

2020-07-28 08:38:10

TCPUDP協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品五区 | 日韩精品成人一区二区三区视频 | 欧美成ee人免费视频 | 国产精品久久影院 | 国产在线麻豆精品入口 | 国产精品不卡一区 | 一区二区三区四区国产精品 | 午夜私人影院 | 国产精品久久久久无码av | 午夜视频免费网站 | 日韩精品一区二区三区中文在线 | 久久成人一区 | 二区在线观看 | 国产男人的天堂 | 亚洲大片| 国产精品免费高清 | 91一区二区 | 99精品一区 | 美女视频一区二区三区 | 久久国产一区二区三区 | 国产电影一区二区 | 国产精品久久久久久久久久久久久久 | 91精品中文字幕一区二区三区 | 国产成人精品网站 | 91成人在线视频 | 91免费版在线观看 | 日韩欧美在线不卡 | 成年人免费看的视频 | 亚洲精品一区在线观看 | 成人午夜免费福利视频 | 国产精品99久久久久久久久 | 国产日韩精品一区二区 | 三级黄色片在线播放 | 99精品国产在热久久 | 在线观看成人精品 | 韩日一区二区三区 | 天天干视频 | 中文字幕在线不卡 | 精品粉嫩aⅴ一区二区三区四区 | 久久99久久99精品免视看婷婷 | 国产精品久久国产精品 |