成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

tcp的認(rèn)知和應(yīng)用

chanthuang / 3510人閱讀

摘要:表示首部的長度為字節(jié)除掉和剛好字節(jié)。差錯控制,校驗(yàn)和的計算包括首部數(shù)據(jù)和其它填充字節(jié)。如果兩次校驗(yàn)和一致說明數(shù)據(jù)是正確的,否則將認(rèn)為數(shù)據(jù)被破壞,接收端將丟棄該數(shù)據(jù)。此時包的序號被設(shè)定為收到的確認(rèn)號,而響應(yīng)號則為。

什么是tcp tcp定義

tcp是網(wǎng)絡(luò)七層模型當(dāng)中傳輸層的協(xié)議,由IETF的RFC 793定義,是面向連接的、可靠的、基于字節(jié)流的通信協(xié)議。而傳輸層位于七層模型的中間,下面是網(wǎng)絡(luò)層,上面的話有應(yīng)用層,承上啟下,地位還是很重要的。在傳輸層中還有一種協(xié)議udp(無連接、不保證可靠性)。相比來說tcp有以下特點(diǎn)

傳輸可靠,數(shù)據(jù)丟失有重傳機(jī)制

數(shù)據(jù)分段打包傳輸,對每個數(shù)據(jù)編號,控制順序

流量控制,避免擁塞,因?yàn)門CP連接雙方有固定大小緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。

tcp數(shù)據(jù)包格式


針對上面圖中的結(jié)構(gòu)劃分,下面進(jìn)行下解釋

source port 和 destination port 都是16位,計算機(jī)端口識別訪問那個服務(wù), 其中source port 是隨機(jī)的,而destination port決定接受方由那個程序來接受并且因?yàn)槭?6位,所以說程序的最大端口號65535

sequence Number 是發(fā)送數(shù)據(jù)包中的第一個字節(jié)的序列號,假設(shè)當(dāng)前的序列號為 s,發(fā)送數(shù)據(jù)長度為 l,則下次發(fā)送數(shù)據(jù)時的序列號為 s + l。在建立連接時通常由計算機(jī)生成一個隨機(jī)數(shù)作為序列號的初始值

Acknowledgment Number 它等于下一次應(yīng)該接收到的數(shù)據(jù)的序列號。可以認(rèn)為這個位置以前所有的數(shù)據(jù)都已被正常接收。
header length TCP 首部的長度,單位為 4 字節(jié)。如果沒有可選字段,那么這里的值就是 5。表示 TCP 首部的長度為 20 字節(jié)(除掉data和option,剛好20字節(jié))。
reserved

URG表示Urgent Pointer字段有意義

ACK表示Acknowledgment Number字段有意義

PSH表示有 DATA數(shù)據(jù)傳輸

RST表示復(fù)位TCP連接

SYN表示SYN報文(在建立TCP連接的時候使用)

FIN表示沒有數(shù)據(jù)需要發(fā)送了(在關(guān)閉TCP連接的時候使用)

Windows 表示接收緩沖區(qū)的空閑空間,16位,用來告訴TCP連接另一端自己能夠接收的最大數(shù)據(jù)長度,流量控制的機(jī)制就基于此。
Checksum 差錯控制,TCP校驗(yàn)和的計算包括TCP首部、數(shù)據(jù)和其它填充字節(jié)。在發(fā)送TCP數(shù)據(jù)段時,由發(fā)送端計算校驗(yàn)和,當(dāng)?shù)竭_(dá)目的地時又進(jìn)行一次檢驗(yàn)和計算。如果兩次校驗(yàn)和一致說明數(shù)據(jù)是正確的,否則將認(rèn)為數(shù)據(jù)被破壞,接收端將丟棄該數(shù)據(jù)。
Urgent 是緊急指針,16位,只有URG標(biāo)志位被設(shè)置時該字段才有意義,表示緊急數(shù)據(jù)相對序列號(Sequence Number字段的值)的偏移。

tcp三次握手


說明 上面是一個我寫的測試demo,是一個普通的http請求,下面我們抓包分析一下tcp三次握手的細(xì)節(jié)


說明 第一次握手client通過發(fā)送一個SYN標(biāo)識位和Sequence Numbers(同步序列號)的數(shù)據(jù)段給server請求連接,通過該數(shù)據(jù)段告訴server希望建立連接

說明 第二次握手是server用一個確認(rèn)應(yīng)答ACK標(biāo)志位和Acknowledgment Number告訴client收到了數(shù)據(jù)段,同時自己也發(fā)送一個syn包(syn標(biāo)志位和Sequence Numbers)。

說明 第三次客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。
說明 三次握手完畢,鏈接通道建立成功,下面開始正式數(shù)據(jù)傳輸

針對上面整個過程下面再來一幅圖詳細(xì)總結(jié)說明下

客戶端通過向服務(wù)器端發(fā)送一個SYN來表明希望建立連接,作為三次握手的一部分??蛻舳税堰@段連接的序號設(shè)定為隨機(jī)數(shù)c。

服務(wù)器端應(yīng)當(dāng)為一個合法的SYN回送一個SYN/ACK。ACK的確認(rèn)碼應(yīng)為c+1,SYN/ACK包本身又有一個隨機(jī)產(chǎn)生的序號s。

最后,客戶端再發(fā)送一個ACK。當(dāng)服務(wù)端收到這個ACK的時候,就完成了三次握手,并進(jìn)入了連接創(chuàng)建狀態(tài)。此時包的序號被設(shè)定為收到的確認(rèn)號c+1,而響應(yīng)號則為s+1。

tcp四次斷開


下面描述下整個過程,過程和三次握手機(jī)制一樣,也是用一些標(biāo)志位來實(shí)現(xiàn)斷開的過程,詳細(xì)步驟過程不在圖形化,因?yàn)樾枰姆襟E圖,太占篇幅了,下面根據(jù)上面的流程圖大致解釋說明一下。

client發(fā)送FIN標(biāo)志位,表示出要斷開連接的請求的含義

server進(jìn)行響應(yīng),發(fā)送ack標(biāo)識,表示確認(rèn)收到斷開連接請求

server 發(fā)送FIN標(biāo)志位,提出反方向的關(guān)閉要求

client 發(fā)送ack標(biāo)志位,標(biāo)識確認(rèn)收到的主機(jī)B的關(guān)閉連接請求

tcp應(yīng)用場景

適合對傳輸數(shù)據(jù)要求比較可靠的地方,例如常見的ftp,http,https,smtp等等這些應(yīng)用層的協(xié)議都是基于tcp的封裝;還有實(shí)戰(zhàn)中常見套接字編程,可以用來開發(fā)瀏覽器通信模塊,以及p2p的下載工具等等,這些底層都是都是基于tcp協(xié)議。

如何使用tcp

協(xié)議只是一個規(guī)范,實(shí)現(xiàn)形式有多種,具體而言在node當(dāng)中使用的話如下形式

let net = require("net");
let path = require("path");
let ws = require("fs").createWriteStream(path.join(__dirname, "msg.txt"));
let server = net.createServer(function (socket) {
    socket.pipe(ws, { end: false });

});
server.listen(8080);
創(chuàng)建一個tcp服務(wù)器監(jiān)聽8080端口,并將接受的數(shù)據(jù)存儲到msg.txt文件中,上面的socket是一個雙工流,既可寫又可以讀,下面是測試的輸出結(jié)果


說明 上面只是一個簡單的實(shí)例,更多用法,可以參考node當(dāng)中net模塊

參考鏈接
https://zh.wikipedia.org/wiki...
http://nodejs.cn/api/
http://www.freebuf.com/column...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107392.html

相關(guān)文章

  • HTTP1.1 Keep-Alive到底算不算長連接?

    摘要:在基礎(chǔ)架構(gòu)部沉浸了半年,有一些認(rèn)知刷新想和童靴們交代一下,不一定全面,僅代表此時的認(rèn)知,也歡迎筒靴們提出看法。本文聊一聊口嗨用語長連接短連接,文章會按照下面的思維導(dǎo)圖來講述在基礎(chǔ)架構(gòu)部沉浸了半年,有一些認(rèn)知刷新想和童靴們交代一下, 不一定全面,僅代表此時的認(rèn)知, 也歡迎筒靴們提出看法。本文聊一聊口嗨用語:長連接、短連接, 文章會按照下面的思維導(dǎo)圖來講述:

    shleyZ 評論0 收藏0
  • Easyswoole 源碼學(xué)習(xí)個人解析 目錄

    摘要:易用穩(wěn)定,本次想通過對的學(xué)習(xí)和個人解析,吸收框架的思想和設(shè)計知識,加強(qiáng)自己對的認(rèn)知和理解。當(dāng)然,筆者能力水平有限,后續(xù)的文章如有錯誤,還請指出和諒解。目錄如下后續(xù)添加文章都會記錄在此服務(wù)啟動過程以及主體設(shè)計流程源碼解析 前言 swoole是什么?官網(wǎng)的原話介紹是這樣的: Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務(wù)器,異步 TCP/UDP 網(wǎng)絡(luò)客戶端,異步 ...

    CoXie 評論0 收藏0
  • 阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評論0 收藏0
  • Node.js 是什么?我為什么選擇它?

    摘要:單線程使用單線程來運(yùn)行,而不是向之類的其它服務(wù)器,每個請求將生產(chǎn)一個線程,這種方法避免了上下文切換和內(nèi)存中的大量執(zhí)行堆棧,這也是和其它服務(wù)器為解決上一個年,著名的并發(fā)連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當(dāng)我們學(xué)習(xí)一項(xiàng)新的事物的時候,我們首先要知道它來...

    Joyven 評論0 收藏0

發(fā)表評論

0條評論

chanthuang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<