摘要:協(xié)議的定義屬于傳輸層協(xié)議,提供了一種端到端的連接。如果兩次校驗(yàn)和一致說明數(shù)據(jù)是正確的,否則將認(rèn)為數(shù)據(jù)被破壞,接收端將丟棄該數(shù)據(jù)緊急指針盡在緊急控制位為時(shí)有效。結(jié)尾是一個(gè)非常復(fù)雜的協(xié)議,這里稍微總結(jié)了一下,隨著學(xué)習(xí)時(shí)間增加,繼續(xù)補(bǔ)充。
TCP協(xié)議的定義
TCP屬于傳輸層協(xié)議,提供了一種端到端的連接。
是面向連接的、可靠的的進(jìn)程到進(jìn)程通信的協(xié)議
TCP提供全雙工服務(wù),即數(shù)據(jù)可在同一時(shí)間雙向傳播
TCP將若干個(gè)字節(jié)構(gòu)成一個(gè)分組,此分組稱為報(bào)文段(Segment)
TCP的功能將數(shù)據(jù)進(jìn)行分段打包傳輸
對每個(gè)數(shù)據(jù)包編號控制順序
運(yùn)輸中丟失、重發(fā)和丟棄處理
流量控制避免擁塞
TCP數(shù)據(jù)包封裝?源端口號和目標(biāo)端口號,計(jì)算機(jī)通過端口號識別訪問哪個(gè)服務(wù),比如http服務(wù)或ftp服務(wù),發(fā)送方端口號是進(jìn)行隨機(jī)端口,目標(biāo)端口號決定了接收方哪個(gè)程序來接收
32位序列號 TCP用序列號對數(shù)據(jù)包進(jìn)行標(biāo)記,以便在到達(dá)目的地后重新重裝,假設(shè)當(dāng)前的序列號為 s,發(fā)送數(shù)據(jù)長度為 l,則下次發(fā)送數(shù)據(jù)時(shí)的序列號為 s + l。在建立連接時(shí)通常由計(jì)算機(jī)生成一個(gè)
確認(rèn)應(yīng)答號 它等于下一次應(yīng)該接收到的數(shù)據(jù)的序列號。假設(shè)發(fā)送端的序列號為 s,發(fā)送數(shù)據(jù)的長度為 l,那么接收端返回的確認(rèn)應(yīng)答號也是 s + l。發(fā)送端接收到這個(gè)確認(rèn)應(yīng)答后,可以認(rèn)為這個(gè)位置以前所有的數(shù)據(jù)都已被正常接收。
首部長度:TCP 首部的長度,單位為 4 字節(jié)。如果沒有可選字段,那么這里的值就是 5。表示 TCP 首部的長度為 20 字節(jié)。
控制位 TCP的連接、傳輸和斷開都受這六個(gè)控制位的指揮
URG 緊急指針:控制位為 1 時(shí)有效。表示緊急數(shù)據(jù)的末尾在 TCP 數(shù)據(jù)部分中的位置。通常在暫時(shí)中斷通信時(shí)使用(比如輸入 Ctrl + C)。
ACK(acknowledgement 確認(rèn))為1表示確認(rèn)號
PSH(push急迫位) 緩存區(qū)將滿,立刻傳輸速度
RST(reset重置位) 連接斷了重新連接
SYN(synchronous建立聯(lián)機(jī)) 同步序號位 TCP建立連接時(shí)要將這個(gè)值設(shè)為1
FIN發(fā)送端完成位,提出斷開連接的一方把FIN置為1表示要斷開連接
窗口大小:用于表示從應(yīng)答號開始能夠接受多少個(gè) 8 位字節(jié)。如果窗口大小為 0,可以發(fā)送窗口探測。 窗口值 說明本地可接收數(shù)據(jù)段的數(shù)目,這個(gè)值的大小是可變的。當(dāng)網(wǎng)絡(luò)通暢時(shí)將這個(gè)窗口值變大加快傳輸速度,當(dāng)網(wǎng)絡(luò)不穩(wěn)定時(shí)減少這個(gè)值可以保證網(wǎng)絡(luò)數(shù)據(jù)的可靠傳輸。它是來在TCP傳輸中進(jìn)行流量控制的
校驗(yàn)和: 用來做差錯(cuò)控制,TCP校驗(yàn)和的計(jì)算包括TCP首部、數(shù)據(jù)和其它填充字節(jié)。在發(fā)送TCP數(shù)據(jù)段時(shí),由發(fā)送端計(jì)算校驗(yàn)和,當(dāng)?shù)竭_(dá)目的地時(shí)又進(jìn)行一次檢驗(yàn)和計(jì)算。如果兩次校驗(yàn) 和一致說明數(shù)據(jù)是正確的,否則 將認(rèn)為數(shù)據(jù)被破壞,接收端將丟棄該數(shù)據(jù)
緊急指針:盡在 URG(urgent緊急) 控制位為 1 時(shí)有效。表示緊急數(shù)據(jù)的末尾在 TCP 數(shù)據(jù)部分中的位置。通常在暫時(shí)中斷通信時(shí)使用(比如輸入 Ctrl + C)
TCP的握手與斷開 建立連接時(shí)的三次握手第一次握手主機(jī)A通過一個(gè)標(biāo)識為SYN標(biāo)識位的數(shù)據(jù)段發(fā)送給主機(jī)B請求連接,通過該數(shù)據(jù)段告訴主機(jī)B希望建立連接,需要B應(yīng)答,并告訴主機(jī)B傳輸?shù)钠鹗夹蛄刑?/p>
第二次握手是主機(jī)B用一個(gè)確認(rèn)應(yīng)答ACK和同步序列號SYNC標(biāo)志位的數(shù)據(jù)段來響應(yīng)主機(jī)A,一是發(fā)送ACK告訴主機(jī)A收到了數(shù)據(jù)段,二是通知主機(jī)A從哪個(gè)序列號做標(biāo)記。
第三次握手是主機(jī)A確認(rèn)收到了主機(jī)B的數(shù)據(jù)段并可以開始傳輸實(shí)際數(shù)據(jù)。
斷開連接時(shí)的四次請求
主機(jī)A發(fā)送FIN控制位發(fā)出斷開連接的請求
主機(jī)B進(jìn)行響應(yīng),確認(rèn)收到斷開連接請求
主機(jī)B提出反方向的關(guān)閉要求
主機(jī)A確認(rèn)收到的主機(jī)B的關(guān)閉連接請求
為什么要四次分手?TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議。TCP是全雙工 模式,這就意味著,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí),只是表示主機(jī)1已經(jīng)沒有數(shù)據(jù)要發(fā)送了,主機(jī)1告訴主機(jī)2, 它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了;但是,這個(gè)時(shí)候主機(jī)1還是可以接受來自主機(jī)2的數(shù)據(jù);當(dāng)主機(jī)2返回ACK報(bào)文 段時(shí),表示它已經(jīng)知道主機(jī)1沒有數(shù)據(jù)發(fā)送了,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的;當(dāng)主機(jī)2也發(fā)送了FIN 報(bào)文段時(shí),這個(gè)時(shí)候就表示主機(jī)2也沒有數(shù)據(jù)要發(fā)送了,就會告訴主機(jī)1,我也沒有數(shù)據(jù)要發(fā)送了,之后彼此 就會愉快的中斷這次TCP連接。
結(jié)尾TCP是一個(gè)非常復(fù)雜的協(xié)議,這里稍微總結(jié)了一下,隨著學(xué)習(xí)時(shí)間增加,繼續(xù)補(bǔ)充。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/107598.html
摘要:通常來說所有的的操作都是從開始的一個(gè)類似于一個(gè)和對比我們可以在同一個(gè)中執(zhí)行讀和寫操作然而同一個(gè)僅僅支持讀或?qū)懣梢援惒降刈x寫而是阻塞的同步讀寫總是從中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入到中類型有文件操作操作操作操作使用在服務(wù)器端這些通道涵蓋了和網(wǎng)絡(luò)以及文件 Java NIO Channel 通常來說, 所有的 NIO 的 I/O 操作都是從 Channel 開始的. 一個(gè) channel 類似于一個(gè) ...
閱讀 25804·2021-09-29 09:41
閱讀 4915·2021-09-10 11:20
閱讀 1994·2021-09-09 09:32
閱讀 1948·2019-08-30 15:44
閱讀 3263·2019-08-29 17:13
閱讀 2866·2019-08-29 14:14
閱讀 2137·2019-08-29 14:11
閱讀 3277·2019-08-29 12:36