最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux之UDP和TCP報頭管理方式

 更新時間:2025年08月05日 14:56:02   作者:??小陳在拼命??  
文章系統(tǒng)講解了傳輸層協(xié)議UDP與TCP的核心區(qū)別:UDP無連接、不可靠,適合實時傳輸(如視頻),通過端口號標(biāo)識應(yīng)用;TCP有連接、可靠,通過確認(rèn)應(yīng)答、序號、窗口機(jī)制保障數(shù)據(jù)完整與順序,適用于需可靠傳輸?shù)膱鼍?/div>

關(guān)于UDP和TCP 我們就要重點聊一聊傳輸層(負(fù)責(zé)數(shù)據(jù)能夠從發(fā)送端傳輸接收端.

一、關(guān)于端口號

1.1 端口號的理解

端口號(Port)標(biāo)識了一個主機(jī)上進(jìn)行通信的不同的應(yīng)用程序;

每一個應(yīng)用層服務(wù)(進(jìn)程)都綁定著自己的協(xié)議,而具體這個數(shù)據(jù)要傳輸給哪一個應(yīng)用程序,是要根據(jù)具體的端口號來決定的,而交給哪個服務(wù)的本質(zhì)也是交給哪個進(jìn)程又因為進(jìn)程bind了自己的端口號所以O(shè)S究竟會把數(shù)據(jù)交給誰,其實是根據(jù)端口號來確認(rèn)的!

在TCP/IP協(xié)議中, 用 "源IP", "源端口號", "目的IP", "目的端口號", "協(xié)議號" 這樣一個五元組來標(biāo)識一個通信(可以通過netstat -n查看);

1.2 端口號范圍的劃分

0 - 1023: 知名端口號, HTTP, FTP, SSH等這些廣為使用的應(yīng)用層協(xié)議, 他們的端口號都是固定的.

1024 - 65535: 操作系統(tǒng)動態(tài)分配的端口號. 客戶端程序的端口號, 就是由操作系統(tǒng)從這個范圍分配的.

1.3 認(rèn)識知名端口號

有些服務(wù)器是非常常用的, 為了使用方便, 人們約定一些常用的服務(wù)器, 都是用以下這些固定的端口號:

  • 1、ssh服務(wù)器, 使用22端口
  • 2、ftp服務(wù)器, 使用21端口
  • 3、telnet服務(wù)器, 使用23端口
  • 4、http服務(wù)器, 使用80端口
  • 5、https服務(wù)器, 使用443

執(zhí)行下面的命令, 可以看到知名端口號

cat /etc/services

我們自己寫一個程序使用端口號時, 要避開這些知名端口號.

1.4 一個進(jìn)程可以bind多個端口號

一個端口號不能被多個進(jìn)程bind,但是一個進(jìn)程可以被多個端口號bind的(一個進(jìn)程可以有多個文件描述符,而每一個文件描述符都可以對應(yīng)一個端口號,)!!

問題:什么情況下需要一個進(jìn)程綁定多個端口號呢??

---->比如HTTP和HTTPS,同一個Web服務(wù)器可能需要監(jiān)聽80和443端口,分別處理HTTP和HTTPS的請求(每次調(diào)用bind都會為該進(jìn)程創(chuàng)建一個獨立的socket,這些socket是由內(nèi)核管理的,他們之間是相互獨立互不影響的,所以bind多個套接字就對應(yīng)監(jiān)聽多個套接字?。。?/span>

1.5 相關(guān)命令

1、netstat是一個用來查看網(wǎng)絡(luò)狀態(tài)的重要工具.

  • 語法:netstat [選項]
  • 功能:查看網(wǎng)絡(luò)狀態(tài)

常用選項:

  • n 拒絕顯示別名,能顯示數(shù)字的全部轉(zhuǎn)化成數(shù)字
  • l 僅列出有在 Listen (監(jiān)聽) 的服務(wù)狀態(tài)
  • p 顯示建立相關(guān)鏈接的程序名
  • t (tcp)僅顯示tcp相關(guān)選項
  • u (udp)僅顯示udp相關(guān)選項
  • a (all)顯示所有選項,默認(rèn)不顯示LISTEN相關(guān)

其中unix是域間套接字,用來進(jìn)行本地通信(懂了網(wǎng)絡(luò)套接字之后學(xué)習(xí)成本就不大了?。?/span>

2、pidof在查看服務(wù)器的進(jìn)程id時非常方便.

語法:pidof [進(jìn)程名]

功能:通過進(jìn)程名, 查看進(jìn)程id

二、UDP報頭

2.1 研究協(xié)議的一些具體問題

1、報頭和有效載荷是如何進(jìn)行分離的??

2、有效載荷應(yīng)該交付給上層的那一個協(xié)議呢?(協(xié)議字段、方案)

3、認(rèn)識報頭的組成

4、學(xué)習(xí)協(xié)議的周邊知識

2.2 UDP協(xié)議端格式

問題1:報頭和有效載荷是如何分離的呢??

------>UDP采用的是定長分離(8字節(jié)),通過讀取前8個字節(jié),可以讀到UDP的長度(16位UDP長度, 表示整個數(shù)據(jù)報(UDP首部+UDP數(shù)據(jù))的最大長度;),然后數(shù)據(jù)的大小就是UDP長度-8,就實現(xiàn)了報頭和有效載荷的分離——>固定長度+自描述字段

問題2:有效載荷又是如何交付給上層的??

——>分離之后通過報頭信息的源端口號和目的端口號,確認(rèn)應(yīng)該交付給那個進(jìn)程(一般來說已經(jīng)bind相關(guān)端口號了)

問題3:UDP可以保證可靠性么??

——> 雖然不保證可靠性,但是至少要是對的,其中UDP校驗和就是一種檢驗UDP數(shù)據(jù)包是否有誤的校驗機(jī)制,他通過了某種算法將UDP數(shù)據(jù)包中的所有數(shù)據(jù)進(jìn)行計算然后存儲在報頭字段中,以便確保接收方在收到數(shù)據(jù)包后進(jìn)行校驗。如果校驗失敗的話,就直接把這個數(shù)據(jù)包丟棄!!

問題4:UDP有什么應(yīng)用場景?

——>比如我們的視頻傳輸就是UDP協(xié)議,其實就是無數(shù)張相片的組成傳輸過來,而你切換清晰度無非就跟圖片的一些像素信息有關(guān),像素越高越清晰一般就會越大,可能就會導(dǎo)致udp的傳送速度變慢,有時候你電視劇看著看著出現(xiàn)緩沖了,你可能就會把畫質(zhì)調(diào)低一點這樣傳輸就會快一點,甚至有些時候?qū)嵲诰W(wǎng)絡(luò)太擁塞了可能會出現(xiàn)丟包的情況,那么視頻就會出現(xiàn)異常,但是UDP對這種現(xiàn)象是不負(fù)責(zé)任的??!因為他半身就不保證可靠性。。而如果你想保證可靠性那你就應(yīng)該用TCP協(xié)議,所以研究UDP的應(yīng)用場景,其實就是基于上層不同協(xié)議對應(yīng)的應(yīng)用場景是否需要選擇UDP!

問題5:如果UDP數(shù)據(jù)包太大怎么辦??

——>我們注意到, UDP協(xié)議首部中有一個16位的最大長度. 也就是說一個UDP能傳輸?shù)臄?shù)據(jù)最大長度是64K(包含UDP首部).然而64K在當(dāng)今的互聯(lián)網(wǎng)環(huán)境下, 是一個非常小的數(shù)字.如果我們需要傳輸?shù)臄?shù)據(jù)超過64k,就需要在應(yīng)用層手動的分包, 多次發(fā)送并在接收端手動拼裝(面向數(shù)據(jù)報)

2.3 UDP的特點

UDP傳輸?shù)倪^程類似于寄信、寄快遞。

  • 1、無連接: 知道對端的IP和端口號就直接進(jìn)行傳輸, 不需要建立連接;
  • 2、不可靠: 沒有確認(rèn)機(jī)制, 沒有重傳機(jī)制; 如果因為網(wǎng)絡(luò)故障該段無法發(fā)到對方, UDP協(xié)議層也不會給應(yīng)用層 返回任何錯誤信息;
  • 3、面向數(shù)據(jù)報: 不能夠靈活的控制讀寫數(shù)據(jù)的次數(shù)和數(shù)量;

應(yīng)用層交給UDP多長的報文, UDP原樣發(fā)送, 既不會拆分, 也不會合并,要么就收一個,要么就不收,沒有半個或者一個半的情況?。?/p>

舉例:用UDP傳輸100字節(jié)的數(shù)據(jù),如果如果發(fā)送端調(diào)用一次sendto, 發(fā)送100個字節(jié), 那么接收端也必須調(diào)用對應(yīng)的一次recvfrom, 接收100個 字節(jié); 而不能循環(huán)調(diào)用10次recvfrom, 每次接收10個字節(jié);

2.4 UDP的緩沖區(qū)

1、UDP沒有真正意義上的發(fā)送緩沖區(qū)(因為他不需要!?。? 調(diào)用sendto會直接交給內(nèi)核, 由內(nèi)核將數(shù)據(jù)傳給網(wǎng)絡(luò)層協(xié)議進(jìn)行后 續(xù)的傳輸動作;

2、UDP具有接收緩沖區(qū). 但是這個接收緩沖區(qū)不能保證收到的UDP報的順序和發(fā)送UDP報的順序一致; 如果緩沖區(qū)滿了, 再到達(dá)的UDP數(shù)據(jù)就會被丟棄;

3、UDP的socket既能讀也能寫,也是全雙工

2.5 基于UDP的應(yīng)用層協(xié)議

  • NFS: 網(wǎng)絡(luò)文件系統(tǒng)
  • TFTP: 簡單文件傳輸協(xié)議
  • DHCP: 動態(tài)主機(jī)配置協(xié)議
  • BOOTP: 啟動協(xié)議(用于無盤設(shè)備啟動)
  • DNS: 域名解析協(xié)議
  • 當(dāng)然, 也包括你自己寫UDP程序時自定義的應(yīng)用層協(xié)議;

2.6 UDP的結(jié)構(gòu)

因為Linux系統(tǒng)是用C語言寫的,所以UDP報頭的結(jié)構(gòu)其實涉及到結(jié)構(gòu)體的位段。

填上報頭數(shù)據(jù),然后帶上有效載荷形成UDP報文,我們就可以發(fā)送了?。?/p>

UDP并不需要有發(fā)送緩沖區(qū),是因為發(fā)送方準(zhǔn)備好了就可以直接發(fā)了,但是他需要有接收緩沖區(qū),因為他把數(shù)據(jù)發(fā)給對方之后可能對方并不能立即去處理這個數(shù)據(jù),所以在對方的接收緩沖區(qū)里可能會存在多個UDP報文,那么也就必然要求OS必須將多個UDP報文給管理起來??!所以需要先描述再組織!!

sk_buff就是服務(wù)端管理UDP報文的緩沖區(qū) 其中start指向緩沖區(qū)的頭部(報文的頭部)、end指向緩沖區(qū)的尾部、pos指向有效數(shù)據(jù)的尾部。然后再用鏈表形式去鏈接管理起來。此時我們OS將對UDP報文的管理轉(zhuǎn)化成了對sk_buff結(jié)構(gòu)體的管理

所以新的UDP數(shù)據(jù)就會連接在這個鏈表上,而UDP數(shù)據(jù)的丟棄就是把他對應(yīng)的結(jié)構(gòu)體給釋放了

三、TCP報頭

3.1 傳輸控制協(xié)議的理解

TCP全稱為 "傳輸控制協(xié)議(Transmission Control Protocol"). 人如其名, 要對數(shù)據(jù)的傳輸進(jìn)行一個詳細(xì)的控制;

我們平時調(diào)用的write、read、recv、send其實本質(zhì)上都是拷貝函數(shù),要么將用戶緩沖區(qū)的內(nèi)容拷貝到發(fā)送緩沖區(qū),要么將接受緩沖區(qū)的內(nèi)容拷貝到用戶緩沖區(qū)進(jìn)行處理,本質(zhì)來說就是不斷把數(shù)據(jù)放到網(wǎng)絡(luò)中,而具體數(shù)據(jù)要什么時候發(fā)送,發(fā)送多少,出錯了怎么辦,是由TCP協(xié)議自主決定的?。?!!

其實通過TCP協(xié)議控制網(wǎng)絡(luò)傳輸可靠性將數(shù)據(jù)從一臺主機(jī)的發(fā)送緩沖區(qū)安全地交付到另一臺主機(jī)的接收緩沖區(qū) ,要求數(shù)據(jù)原封不動的發(fā)送過去,所謂發(fā)送,本質(zhì)上是一種也是一種跨網(wǎng)絡(luò)的拷貝?。?/strong>

當(dāng)然,對方也可以對我們發(fā)送,因為TCP是全雙工的,有自己的發(fā)送緩沖區(qū)和接受緩沖區(qū)!

問題1:TCP和文件系統(tǒng)的關(guān)聯(lián)?

----->TCP其實和文件系統(tǒng)很像,就是我們使用系統(tǒng)調(diào)用接口本質(zhì)上是將用戶層緩沖區(qū)數(shù)據(jù)刷新到內(nèi)核的文件緩沖區(qū),但是具體這個文件緩沖區(qū)什么時候刷新到磁盤上是由OS自主決定的,而網(wǎng)絡(luò)只不過是將磁盤換成了網(wǎng)卡,這進(jìn)一步說明了Linux中一切皆文件的思想 ,他們IO的思路是一模一樣的,只不過文件是在本地的話,出錯的概率很低,而網(wǎng)卡文件需要經(jīng)過網(wǎng)絡(luò),所以需要有TCP協(xié)議來確??煽啃?!

問題2:先暫時不考慮可靠性,先分析數(shù)據(jù)在網(wǎng)絡(luò)中的流動是怎樣的??

----->所以我們想要發(fā)送一個網(wǎng)絡(luò)數(shù)據(jù),先在應(yīng)用層通過相關(guān)的協(xié)議對結(jié)構(gòu)化數(shù)據(jù)做序列化,然后放到發(fā)送緩沖區(qū)中,然后TCP會幫我們在適當(dāng)?shù)臅r機(jī)把數(shù)據(jù)發(fā)送到對方的接收緩沖區(qū),等待對方的應(yīng)用層通過read讀取。此時一般會出現(xiàn)兩種情況

(1)對方上層由于忙碌始終無法處理,使得多次發(fā)送的報文都堆積在接收緩沖區(qū),當(dāng)他不忙碌時可能一次read就都讀上去了?。∪缓笊蠈釉傩枰獙@些數(shù)據(jù)解析成一個個完整報文(因為是面向字節(jié)流的),然后反序列化成結(jié)構(gòu)化數(shù)據(jù)供上層使用。而如果湊不齊一個報文,就將他們暫時存儲在自己的用戶層緩沖區(qū),等下次read的時候如果湊齊了再一起拿出來解析

(2)對方的上層會在合適的時機(jī)進(jìn)行read,但是如果發(fā)送方始終沒有發(fā)送,或者網(wǎng)絡(luò)太擁堵導(dǎo)致接收緩沖區(qū)一直沒有數(shù)據(jù),那么read就會阻塞住,然后OS就會把這個進(jìn)程設(shè)置為S狀態(tài),而當(dāng)緩沖區(qū)有數(shù)據(jù)的時候(也就是說OS某些資源就緒的時候)OS會再次調(diào)度這個進(jìn)程去把數(shù)據(jù)從緩沖區(qū)讀上來?。。?/strong>

所以以前我們覺得OS某些資源不就緒從而使得進(jìn)程暫時進(jìn)入S狀態(tài)大多數(shù)指的是因為硬件的速度比較慢,所以需要等待硬件資源就緒,但是今天我們發(fā)現(xiàn)在網(wǎng)絡(luò)的情況中,也有可能是因為對方始終不給你發(fā)數(shù)據(jù),或者由于網(wǎng)絡(luò)擁塞造成接收緩沖區(qū)沒有數(shù)據(jù)可處理,也是屬于資源不就緒的情況,此時調(diào)用read的這個進(jìn)程就必須阻塞住?。?/strong>

問題3:為什么UDP不需要有發(fā)送緩沖區(qū),而TCP必須要有發(fā)送緩沖區(qū)呢?

------>因為UDP發(fā)了就是發(fā)了,他并不關(guān)心對方的接收緩沖區(qū)是不是滿了,如果滿了他就會丟包,此時你也是無感的,UDP不保證可靠性,但是TCP需要保證可靠性啊??!比如說對方如果來不及把數(shù)據(jù)拿到上層處理導(dǎo)致對方接受緩沖區(qū)快滿了,TCP會意識到對方接受能力不行(后面會說),就會減緩發(fā)送的速度,但是我們上層用戶是無感的??!你可能會一直往緩沖區(qū)里寫!所以此時數(shù)據(jù)就會被存儲在發(fā)送緩沖區(qū)里了??!當(dāng)然TCP也不會任由這種情況發(fā)展,他會通過某種方式要求對方趕緊清空自己的接收緩沖區(qū)進(jìn)行接收!

3.2TCP協(xié)議段格式

問題1:TCP報頭如何將數(shù)據(jù)有效地分離呢??

-——>和UDP一樣,通過固定長度+自描述字段,先讀取定長的20個字節(jié),然后再從里面讀取4位首部長度(4位首部長度是包含選項的,他會先算出選項的大小,然后再讀取若干選項,那么剩下的就是數(shù)據(jù)了?。。?/strong>

問題2: 然后將有效載荷交付給上層呢

---->通過自描述字段中的源端口號和目的端口號,就可以知道交付給上層的哪個進(jìn)程了!!

問題3:關(guān)于16位校驗和

----->16位校驗和: 發(fā)送端填充, CRC校驗. 接收端校驗不通過, 則認(rèn)為數(shù)據(jù)有問題. 此處的檢驗和不光包含TCP首部, 也包含TCP數(shù)據(jù)部分.

問題4:為什么TCP的報頭沒有長度呢??

——>因為TCP是面向字節(jié)流(后面會說)的,一直發(fā)的話他就會一直收。所以不需要長度

3.3 TCP確認(rèn)應(yīng)答機(jī)制

TCP憑什么保證可靠性呢??必須要基于確認(rèn)應(yīng)答機(jī)制!!當(dāng)對方成功收到了數(shù)據(jù),就需要對你做出響應(yīng)?。?/p>

應(yīng)答機(jī)制其實廣泛發(fā)生在外面的生活中,舉例:假設(shè)我和我的好朋友打電話,我總會是先喊“喂”,此時我必須得聽到對方的回復(fù)我才能確定他聽到了我的聲音,而我又得再回復(fù)一次他的回復(fù)才能讓他知道我收到了這個回復(fù),如此往復(fù),后一條應(yīng)答都可以證明前一條消息被對方給收到了!!可是這個世界上并不存在百分之百的應(yīng)答!?。∫驗樽钚碌囊粭l消息是不可能收到應(yīng)答!否則就會陷入死循環(huán)!所以我們是無法保證所有發(fā)出去的消息都能得到百分之百的回應(yīng),我們只能保證我們歷史發(fā)過的消息可以得到回應(yīng)!!

因此在TCP的方案里,并不要求對應(yīng)答做應(yīng)答,因為是客戶端給服務(wù)器發(fā)消息,服務(wù)端是被動的,所以我客戶端能收到應(yīng)答就可以保證我發(fā)出的數(shù)據(jù)被服務(wù)器收到了!?。ㄎ业目蛻舳藳]有必要給服務(wù)端發(fā)消息確保應(yīng)答是否收到?。。?mdash;—>這保證了服務(wù)端到客戶端方向上的可靠性!??!因為我們的目的是保證通信雙方兩個方向上的可靠性!

所以應(yīng)答是否有收到呢???萬一丟了怎么辦??TCP對于發(fā)送失敗會有自己另外的策略,有時候會有需要重發(fā)的場景,因此我們會把沒收到響應(yīng)的數(shù)據(jù)暫時保存在緩沖區(qū)中維持一段時間?。?/p>

記?。?!應(yīng)答不一定是單獨發(fā)的!!因為如果此時服務(wù)端也正好想發(fā)消息給你,先發(fā)應(yīng)答再發(fā)消息顯然效率是比較低的!所以他會在發(fā)消息的時候順便應(yīng)答,這就是捎帶應(yīng)答!!

3.416位窗口大小

我們前面提到了一個關(guān)于對方接受能力的問題,如果對方接受能力不足但是你用戶層一直發(fā)消息導(dǎo)致丟包問題顯然是不可靠的,所以我們的TCP除了應(yīng)該有發(fā)送緩沖區(qū)的存在,還應(yīng)該有一些配套的解決方案??!

首先TCP里面有一種機(jī)制就是超時重傳(下一篇會說),就是他在發(fā)送的時候不會立馬將數(shù)據(jù)從緩沖區(qū)清空,而是如果在規(guī)定時間內(nèi)沒有收到對方的應(yīng)答,他就會判定數(shù)據(jù)丟失了然后再補(bǔ)發(fā)。但是這種方案顯然不夠合理,因為我這個數(shù)據(jù)千里迢迢來到了你這里,浪費(fèi)了這么多的網(wǎng)絡(luò)資源,卻因為你的接收能力不行導(dǎo)致我在沒有明顯錯誤的情況下被你丟棄,那么曾經(jīng)的發(fā)送不就是沒有意義了的嗎??所以我們更好的方式就是應(yīng)該考慮在發(fā)送的時候就去控制傳輸速度避免報文的丟失!!

而通過控制用戶發(fā)送速度來讓對方能夠來得及接收從而規(guī)避大量的丟包情況,這種方案叫做流量控制(下一篇會說)。

可是,發(fā)慢一點的依據(jù)是什么呢???我怎么知道對方的緩沖區(qū)接受能力是多少呢??別忘了TCP是有確認(rèn)應(yīng)答機(jī)制的??!我發(fā)給你一個報文,你是要響應(yīng)的?。《夷沩憫?yīng)的時候會加上報文,而報文里的字段包含了16位的窗口大小,而窗口大小填充的就是服務(wù)端剩余空間的大?。?/span>!TCP可以因此推斷出對方的接收能力從而控制傳輸速度!!

同理,雙方在通信的時候都會有報文的往來,所以其實在建立連接的時候雙方不僅僅只是建立連接了,同時也協(xié)商了雙方的接收能力,那么雙方都可以互相進(jìn)行流量控制!

問題:16位數(shù)字最大表示65535, 那么TCP窗口最大就是65535字節(jié)么?

——>實際上, TCP首部40字節(jié)選項中還包含了一個窗口擴(kuò)大因子M, 實際窗口大小是窗口字段的值左移 M 位;

3.5序號解決數(shù)據(jù)包亂序

tcp的原始過程,發(fā)一條消息確認(rèn)響應(yīng)之后再發(fā)送下一條,但是如果我們想要發(fā)送很多信息,但是服務(wù)端卻一直不應(yīng)答,顯然這種串型的效率是很低的??!所以我們的客戶端一般會一次向服務(wù)端發(fā)送一堆消息!!

批量化發(fā)請求,也意味著需要批量化應(yīng)答?。∧敲丛谔岣咝实耐瑫r就會伴生出兩個問題(1)數(shù)據(jù)亂序(發(fā)出去的數(shù)據(jù)并未按照順序被接收) (2)哪個應(yīng)答對應(yīng)哪個請求

問題1:解決數(shù)據(jù)包亂序的問題

——>報文里會攜帶序號??!是用來保證數(shù)據(jù)的按時到達(dá)的,另一方接收緩沖區(qū)會根據(jù)序號做排序??!其實這里的序號對應(yīng)的就是發(fā)送的數(shù)據(jù)的最后一個字符的下標(biāo)?。?TCP對每個字節(jié)的數(shù)據(jù)都進(jìn)行了編號,即為序列號

但是要記住的是,雖然是按照字節(jié)做的編號,但是發(fā)送的時候不是一個字節(jié)一個字節(jié)發(fā)的,而是一個數(shù)據(jù)塊一個數(shù)據(jù)塊地發(fā)!!

問題2:一次返回這么多應(yīng)答,你怎么確定哪個應(yīng)答對應(yīng)的是哪個數(shù)據(jù)呢??

——>需要引入確認(rèn)序號(填充的是收到的報文序號+1)的定義:表示確認(rèn)序號之前的數(shù)據(jù)都已經(jīng)被接收到了,下一次發(fā)送,請從確認(rèn)序號指定的數(shù)字開始發(fā)送?。?/p>

問題3:應(yīng)答不是只有報文沒有數(shù)據(jù)嗎??那我為什么不直接把你的序號+1返回去而是要同時擁有序號和確認(rèn)序號呢??

——>(1)因為可能會存在“捎帶應(yīng)答”的情況(雙重身份),可能我服務(wù)器也會順便發(fā)送我的緩沖區(qū)數(shù)據(jù),本身的數(shù)據(jù)是用的順序序號,而應(yīng)答用的是確認(rèn)序號,所以必須分開不能復(fù)用?。?/strong>

(2)服務(wù)端和客戶端地位是對等的,所以客戶端給服務(wù)端發(fā)消息的時候服務(wù)端也可能在給客戶端發(fā)消息,所以捎帶應(yīng)答的情況是經(jīng)常會出現(xiàn)的?。∷员仨氁袃山M序號!

問題4:序號會越界或者跟別的數(shù)據(jù)序號出現(xiàn)沖突嗎??

——>序號一般是回繞的,而且回繞特別大,一般不會沖突!!

3.6 引入六個標(biāo)記位

我們都知道,TCP協(xié)議是基于鏈接的,在正常通信之前需要進(jìn)行鏈接,在正常通信之后需要進(jìn)行斷開連接,可是我怎么知道你是這個報文是打算做哪個工作呢???——>所以我們可以知道TCP報文一定有各種不同的類型?。《煌念愋蜎Q定了服務(wù)端要做不同的工作!!

接收方如何得知報頭的類型各自是什么呢??——>需要引入6個標(biāo)記位,標(biāo)記位存在的意義就是為了區(qū)分TCP報頭類型的

我們要知道服務(wù)端:客戶端是1:n,所以服務(wù)端必然是存在多個鏈接的!所以O(shè)S必須想辦法把這些“鏈接”管理起來——先描述再組織!所以當(dāng)雙方建立連接成功后比如會建立一個相關(guān)的結(jié)構(gòu)體,然后斷開連接后會各自釋放空間。

(1)ACK: 確認(rèn)號是否有效(應(yīng)答)

(2)SYN: 請求建立連接; 我們把攜帶SYN標(biāo)識的稱為同步報文段(請求三次握手)

(3)FIN: 通知對方, 本端要關(guān)閉了(請求四次揮手)

(4)RST: 對方要求重新建立連接; 我們把攜帶RST標(biāo)識的稱為復(fù)位報文段(鏈接重置)

我們要知道,TCP為了保證可靠性,提供了很多健全的方案,但是這并不代表可以覆蓋所有的情況,因為很多時候會出現(xiàn)一些不可抗力因素(比如協(xié)議bug、網(wǎng)絡(luò)bug等等) 所以TCP是允許鏈接失敗的!!比如某次握手沒有成功(因為最后一個ACK可能沒有收到!)

對于客戶端來說,只要把第三次握手的報文發(fā)出,他就認(rèn)為鏈接建立好了,然后把自己的準(zhǔn)備工作給做好了??!可是一旦ACK真的丟失了,那么服務(wù)端會認(rèn)為鏈接沒有建立好,也就不會做這些準(zhǔn)備工作,因為中間存在時間窗口,所以雙方會出現(xiàn)認(rèn)知不一致的情況,此時客戶端會直接發(fā)送數(shù)據(jù),當(dāng)服務(wù)端接收到后會覺得很奇怪“你明明沒有和我鏈接成功,為什么要給我發(fā)數(shù)據(jù)呢??” 于是這是他會意識到可能是客戶端誤以為跟自己鏈接成功了,所以他會趕快通過RST告訴客戶端“兄弟,你別傳了,你的連接是失敗的,你再重新連接一次吧”這其實就是鏈接重置!

(5)PSH: 提示接收端應(yīng)用程序立刻從TCP緩沖區(qū)把數(shù)據(jù)讀走+

首先我們要知道,其實接收緩沖區(qū)就相當(dāng)于一個內(nèi)存空間,而OS負(fù)責(zé)接收數(shù)據(jù),上層負(fù)責(zé)拿數(shù)據(jù),其實本質(zhì)上就是一個生產(chǎn)消費(fèi)模型,所以流量控制本質(zhì)上就是對生產(chǎn)消費(fèi)模型的一種同步機(jī)制!!

問題:因為得知對方接受緩沖區(qū)沒啥空間了,于是TCP就控制幾乎不往緩沖區(qū)里寫了,可是我得等到什么時候呢??萬一對方已經(jīng)把接收緩沖區(qū)的數(shù)據(jù)刷走了,那我又怎么知道呢???

——>方案1:發(fā)送方會定期詢問對方,看看對方的接收緩沖區(qū)是不是讀完了?。?/span>

方案2:接受方知道自己之前數(shù)據(jù)快滿了,所以刷新之后會給對方發(fā)個響應(yīng)告訴他說可以繼續(xù)發(fā)了

這兩種策略同時存在,如果對方就是一直不拿走,那么TCP會給對方發(fā)送PSH,警告他盡快拿走!

(6)URG: 緊急指針是否有效

3.7緊急指針

報文有一個地方是16位緊急指針,他記錄的是緊急數(shù)據(jù)(需要高優(yōu)先級處理的數(shù)據(jù))的偏移量!

問題1:我知道了偏移量,但是具體有多大呢???

——>他被要求了一個報文只能攜帶一個字節(jié)的緊急數(shù)據(jù),所以我們需要軟件功能來提供一些狀態(tài)編號!!

問題2:緊急數(shù)據(jù)要怎么讀怎么寫呢??

——>send和recive,他們中的選項有一個叫做MSG_OOB

緊急數(shù)據(jù)也叫做帶外數(shù)據(jù)

問題3:緊急數(shù)據(jù)的場景?

——>比如說你當(dāng)前服務(wù)器正在進(jìn)行一個周期性的服務(wù)或者是服務(wù)器爆滿導(dǎo)致卡頓,此時你無論如何申請都得不到對方的響應(yīng),這個時候你很好奇服務(wù)器究竟怎么了,于是你需要發(fā)送詢問,但是這個詢問必須通過帶外數(shù)據(jù)的方式去發(fā)送,才能讓服務(wù)端優(yōu)先處理,然后服務(wù)端會通過一個描述的狀態(tài)碼,在將一個帶外數(shù)據(jù)返回給你,你就知道服務(wù)端究竟是什么情況了!!

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • linux增加iptables防火墻規(guī)則的示例

    linux增加iptables防火墻規(guī)則的示例

    這篇文章主要介紹了linux增加iptables防火墻規(guī)則的示例,大家在使用的時候要把規(guī)則后的中文注釋去掉
    2014-01-01
  • Linux性能監(jiān)控與調(diào)優(yōu)方式詳解

    Linux性能監(jiān)控與調(diào)優(yōu)方式詳解

    本文系統(tǒng)介紹Linux性能監(jiān)控與調(diào)優(yōu)方法,涵蓋CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等指標(biāo)檢測工具及優(yōu)化策略,如進(jìn)程綁定、I/O調(diào)度調(diào)整、TCP緩沖優(yōu)化等,適用于性能問題診斷與解決
    2025-08-08
  • 新手入門級linux系統(tǒng)常用命令大全

    新手入門級linux系統(tǒng)常用命令大全

    本文為大家分享了Linux常用命令,這些命令幾乎每天都要用到,記錄下來方便以后查詢使用
    2018-10-10
  • ubuntu18.04制作raid0教程

    ubuntu18.04制作raid0教程

    本文介紹RAID0創(chuàng)建步驟:檢查物理盤狀態(tài),使用命令指定控制器0、磁盤及類型,驗證虛擬磁盤,分區(qū)、格式化并掛載,RAID0提升讀寫速度,但無冗余,數(shù)據(jù)丟失風(fēng)險高
    2025-08-08
  • Centos 6.8編譯安裝LNMP環(huán)境(Nginx+MySQL+PHP)教程

    Centos 6.8編譯安裝LNMP環(huán)境(Nginx+MySQL+PHP)教程

    這篇文章主要介紹了關(guān)于CentOS 6.8中編譯安裝LNMP環(huán)境的相關(guān)資料,LNMP即Linux,Nginx,MySQL,PHP,文中通過一步步的步驟介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • linux防火墻如何查看狀態(tài)firewall

    linux防火墻如何查看狀態(tài)firewall

    這篇文章主要介紹了linux防火墻如何查看狀態(tài)firewall問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Linux CentOS下安裝Tomcat9及web項目的部署

    Linux CentOS下安裝Tomcat9及web項目的部署

    本文講解在Linux CentOS下安裝Tomcat9,以及Web項目的部署發(fā)布過程,通過實例代碼相結(jié)合的形式給大家介紹的非常的詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • Linux下使用ip netns命令進(jìn)行網(wǎng)口的隔離和配置ip地址

    Linux下使用ip netns命令進(jìn)行網(wǎng)口的隔離和配置ip地址

    這篇文章主要介紹了Linux下使用ip netns命令進(jìn)行網(wǎng)口的隔離和配置ip地址,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • deepin linux 手動升級內(nèi)核的方法

    deepin linux 手動升級內(nèi)核的方法

    這篇文章主要介紹了deepin linux 手動升級內(nèi)核的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Linux設(shè)置文件夾權(quán)限的幾種常用操作方法

    Linux設(shè)置文件夾權(quán)限的幾種常用操作方法

    在Linux系統(tǒng)里,若要把文件夾權(quán)限修改成所有用戶都能對其進(jìn)行修改,可借助chmod命令達(dá)成這一目的,不過,這樣的設(shè)置會帶來較大的安全風(fēng)險,所以建議僅在測試環(huán)境或者對安全性要求不高的場景中使用,下面為你介紹幾種常用的操作方法,需要的朋友可以參考下
    2025-05-05

最新評論

克什克腾旗| 松潘县| 灌阳县| 绍兴市| 东阳市| 宽甸| 阿拉善右旗| 怀宁县| 佛教| 邯郸县| 逊克县| 吉首市| 鄱阳县| 濮阳县| 沾化县| 桐柏县| 兰溪市| 科技| 新余市| 莒南县| 会东县| 盈江县| 都兰县| 湖南省| 原阳县| 库尔勒市| 阿克| 怀集县| 长岭县| 天气| 株洲县| 武平县| 西吉县| 曲阜市| 福清市| 专栏| 咸阳市| 通海县| 广德县| 体育| 龙泉市|