摘要:表示首部的長度為字節除掉和剛好字節。差錯控制,校驗和的計算包括首部數據和其它填充字節。如果兩次校驗和一致說明數據是正確的,否則將認為數據被破壞,接收端將丟棄該數據。此時包的序號被設定為收到的確認號,而響應號則為。
什么是tcp tcp定義
tcp是網絡七層模型當中傳輸層的協議,由IETF的RFC 793定義,是面向連接的、可靠的、基于字節流的通信協議。而傳輸層位于七層模型的中間,下面是網絡層,上面的話有應用層,承上啟下,地位還是很重要的。在傳輸層中還有一種協議udp(無連接、不保證可靠性)。相比來說tcp有以下特點
tcp數據包格式傳輸可靠,數據丟失有重傳機制
數據分段打包傳輸,對每個數據編號,控制順序
流量控制,避免擁塞,因為TCP連接雙方有固定大小緩沖空間。TCP的接收端只允許另一端發送接收端緩沖區所能接納的數據。
針對上面圖中的結構劃分,下面進行下解釋
source port 和 destination port 都是16位,計算機端口識別訪問那個服務, 其中source port 是隨機的,而destination port決定接受方由那個程序來接受并且因為是16位,所以說程序的最大端口號65535
sequence Number 是發送數據包中的第一個字節的序列號,假設當前的序列號為 s,發送數據長度為 l,則下次發送數據時的序列號為 s + l。在建立連接時通常由計算機生成一個隨機數作為序列號的初始值
Acknowledgment Number 它等于下一次應該接收到的數據的序列號。可以認為這個位置以前所有的數據都已被正常接收。
header length TCP 首部的長度,單位為 4 字節。如果沒有可選字段,那么這里的值就是 5。表示 TCP 首部的長度為 20 字節(除掉data和option,剛好20字節)。
reserved
URG表示Urgent Pointer字段有意義
ACK表示Acknowledgment Number字段有意義
PSH表示有 DATA數據傳輸
RST表示復位TCP連接
SYN表示SYN報文(在建立TCP連接的時候使用)
FIN表示沒有數據需要發送了(在關閉TCP連接的時候使用)
Windows 表示接收緩沖區的空閑空間,16位,用來告訴TCP連接另一端自己能夠接收的最大數據長度,流量控制的機制就基于此。
Checksum 差錯控制,TCP校驗和的計算包括TCP首部、數據和其它填充字節。在發送TCP數據段時,由發送端計算校驗和,當到達目的地時又進行一次檢驗和計算。如果兩次校驗和一致說明數據是正確的,否則將認為數據被破壞,接收端將丟棄該數據。
Urgent 是緊急指針,16位,只有URG標志位被設置時該字段才有意義,表示緊急數據相對序列號(Sequence Number字段的值)的偏移。
說明 上面是一個我寫的測試demo,是一個普通的http請求,下面我們抓包分析一下tcp三次握手的細節
說明 第一次握手client通過發送一個SYN標識位和Sequence Numbers(同步序列號)的數據段給server請求連接,通過該數據段告訴server希望建立連接
說明 第二次握手是server用一個確認應答ACK標志位和Acknowledgment Number告訴client收到了數據段,同時自己也發送一個syn包(syn標志位和Sequence Numbers)。
說明 第三次客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK,此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
說明 三次握手完畢,鏈接通道建立成功,下面開始正式數據傳輸
針對上面整個過程下面再來一幅圖詳細總結說明下
tcp四次斷開客戶端通過向服務器端發送一個SYN來表明希望建立連接,作為三次握手的一部分。客戶端把這段連接的序號設定為隨機數c。
服務器端應當為一個合法的SYN回送一個SYN/ACK。ACK的確認碼應為c+1,SYN/ACK包本身又有一個隨機產生的序號s。
最后,客戶端再發送一個ACK。當服務端收到這個ACK的時候,就完成了三次握手,并進入了連接創建狀態。此時包的序號被設定為收到的確認號c+1,而響應號則為s+1。
下面描述下整個過程,過程和三次握手機制一樣,也是用一些標志位來實現斷開的過程,詳細步驟過程不在圖形化,因為需要四幅步驟圖,太占篇幅了,下面根據上面的流程圖大致解釋說明一下。
tcp應用場景client發送FIN標志位,表示出要斷開連接的請求的含義
server進行響應,發送ack標識,表示確認收到斷開連接請求
server 發送FIN標志位,提出反方向的關閉要求
client 發送ack標志位,標識確認收到的主機B的關閉連接請求
適合對傳輸數據要求比較可靠的地方,例如常見的ftp,http,https,smtp等等這些應用層的協議都是基于tcp的封裝;還有實戰中常見套接字編程,可以用來開發瀏覽器通信模塊,以及p2p的下載工具等等,這些底層都是都是基于tcp協議。
如何使用tcp協議只是一個規范,實現形式有多種,具體而言在node當中使用的話如下形式
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); 創建一個tcp服務器監聽8080端口,并將接受的數據存儲到msg.txt文件中,上面的socket是一個雙工流,既可寫又可以讀,下面是測試的輸出結果
說明 上面只是一個簡單的實例,更多用法,可以參考node當中net模塊
參考鏈接
https://zh.wikipedia.org/wiki...
http://nodejs.cn/api/
http://www.freebuf.com/column...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107392.html
摘要:在基礎架構部沉浸了半年,有一些認知刷新想和童靴們交代一下,不一定全面,僅代表此時的認知,也歡迎筒靴們提出看法。本文聊一聊口嗨用語長連接短連接,文章會按照下面的思維導圖來講述在基礎架構部沉浸了半年,有一些認知刷新想和童靴們交代一下, 不一定全面,僅代表此時的認知, 也歡迎筒靴們提出看法。本文聊一聊口嗨用語:長連接、短連接, 文章會按照下面的思維導圖來講述:
摘要:易用穩定,本次想通過對的學習和個人解析,吸收框架的思想和設計知識,加強自己對的認知和理解。當然,筆者能力水平有限,后續的文章如有錯誤,還請指出和諒解。目錄如下后續添加文章都會記錄在此服務啟動過程以及主體設計流程源碼解析 前言 swoole是什么?官網的原話介紹是這樣的: Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/UDP 網絡客戶端,異步 ...
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:單線程使用單線程來運行,而不是向之類的其它服務器,每個請求將生產一個線程,這種方法避免了上下文切換和內存中的大量執行堆棧,這也是和其它服務器為解決上一個年,著名的并發連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當我們學習一項新的事物的時候,我們首先要知道它來...
閱讀 3550·2021-10-09 09:43
閱讀 6148·2021-09-07 10:15
閱讀 2746·2019-08-30 14:03
閱讀 3073·2019-08-29 11:01
閱讀 1715·2019-08-29 10:56
閱讀 1074·2019-08-28 17:52
閱讀 3502·2019-08-26 11:42
閱讀 2547·2019-08-26 10:33