TCP報(bào)文
tcp詳解、tcp與udp對(duì)比等
TCP:傳輸控制協(xié)議
UDP:用戶數(shù)據(jù)報(bào)協(xié)議
源端口和目的端口字段:各占 2 字節(jié)(16位)。端口是運(yùn)輸層與應(yīng)用層的服務(wù)接口。運(yùn)輸層的復(fù)用和分用功能都要通過端口才能實(shí)現(xiàn)。
序列號(hào):在建立連接時(shí)由計(jì)算機(jī)生成的隨機(jī)數(shù)作為其初始值,通過 SYN 包傳給接收端主機(jī),每發(fā)送一次數(shù)據(jù),就「累加」一次該「數(shù)據(jù)字節(jié)數(shù)」的大小。用來解決網(wǎng)絡(luò)包亂序問題。
確認(rèn)應(yīng)答號(hào):指下一次「期望」收到的數(shù)據(jù)的序列號(hào),發(fā)送端收到這個(gè)確認(rèn)應(yīng)答以后可以認(rèn)為在這個(gè)序號(hào)以前的數(shù)據(jù)都已經(jīng)被正常接收。用來解決丟包的問題。
數(shù)據(jù)偏移(即首部長(zhǎng)度):占 4 位,它指出 TCP 報(bào)文段的數(shù)據(jù)起始處距離 TCP 報(bào)文段的起始處有多遠(yuǎn),也就是TCP首部的長(zhǎng)度?!皵?shù)據(jù)偏移”的單位是 32 位字(以 4 字節(jié)為計(jì)算單位),最大1111表示15x4=60個(gè)字節(jié),即表示TCP首部最大長(zhǎng)度為60個(gè)字節(jié),因此“選項(xiàng)”部分最多40個(gè)字節(jié)。
保留字段:占 6 位,保留為今后使用,但目前應(yīng)置為 0。
控制位:
- ?ACK:該位為 1 時(shí),「確認(rèn)應(yīng)答」的字段變?yōu)橛行?,TCP 規(guī)定除了最初建立連接時(shí)的 SYN 包之外該位必須設(shè)置為 1 。
- ?RST:該位為 1 時(shí),表示 TCP 連接中出現(xiàn)異常必須強(qiáng)制斷開連接并進(jìn)行連接重置
- SYN:該位為 1 時(shí),表示希望建立連接,并在其「序列號(hào)」的字段進(jìn)行序列號(hào)初始值的設(shè)定。
- FIN:該位為 1 時(shí),表示今后不會(huì)再有數(shù)據(jù)發(fā)送,希望斷開連接。當(dāng)通信結(jié)束希望斷開連接時(shí),通信雙方的主機(jī)之間就可以相互交換 FIN 位為 1 的 TCP 段。
- 緊急 URG —— 當(dāng) URG = 1 時(shí),表明緊急指針字段有效。它告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快傳送(相當(dāng)于高優(yōu)先級(jí)的數(shù)據(jù))。 即URG=1的數(shù)據(jù)包不用排隊(duì)直接優(yōu)先傳輸。
- PSH:推送(不需要緩沖到內(nèi)存直接交給CPU處理)
窗口大?。航邮沾翱诘拇笮?,實(shí)際上也就是接收緩存能夠容納對(duì)方發(fā)來多少數(shù)據(jù),窗口字段長(zhǎng)度是16位,因此最大的窗口大小為64K字節(jié)
檢驗(yàn)和 :占 2 字節(jié)。檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩部分。在計(jì)算檢驗(yàn)和時(shí),要在TCP 報(bào)文段的前面加上 12 字節(jié)的偽首部。
緊急指針字段 : 占 16 位,指出在本報(bào)文段中緊急數(shù)據(jù)共有多少個(gè)字節(jié)(緊急數(shù)據(jù)放在本報(bào)文段數(shù)據(jù)的最前面)。
可選項(xiàng)(長(zhǎng)度可變),其中可選項(xiàng)有:最大報(bào)文段長(zhǎng)度(MSS);用戶超時(shí)(UTO);窗口縮放(WSOPT)
- MSS:TCP 的數(shù)據(jù)大小如果大于 MSS 大小,則會(huì)在傳輸層進(jìn)行分片,目標(biāo)主機(jī)收到后,也同樣在傳輸層組裝 TCP 數(shù)據(jù)包,如果中途丟失了一個(gè)分片,只需要傳輸丟失的這個(gè)分片,默認(rèn)為536。
- WSOPT:提供窗口的大小,用于在TCP連接的一端對(duì)另端進(jìn)行流量控制。
- 用戶超時(shí)(UTO)
Date:數(shù)據(jù)?
TCP三次握手與四次斷開
三次握手
- 一開始,客戶端和服務(wù)端都處于 CLOSE 狀態(tài)。先是服務(wù)端主動(dòng)監(jiān)聽某個(gè)端口,處于 LISTEN 狀態(tài)
- 客戶端:請(qǐng)求:SYN變成1,sn=100(隨機(jī)生成的報(bào)文序列號(hào)發(fā)送過去),之后客戶端處于 SYN-SENT 狀態(tài)。?? ??? ??? ??? ??? ?
- 服務(wù)端:響應(yīng):SYN變?yōu)?,ACK=1,an=101(表示可以發(fā)送下一個(gè)了),sn=300(接受方再生成一個(gè)報(bào)文序確認(rèn)號(hào)),之后服務(wù)端處于 SYN-RCVD 狀態(tài)。
- 客戶端:確認(rèn)(互相確認(rèn)):ACK=1,sn=101,an=301,之后客戶端處于 ESTABLISHED 狀態(tài)。
- ?服務(wù)端收到客戶端的應(yīng)答報(bào)文后,也進(jìn)入 ESTABLISHED 狀態(tài)。 ?? ??? ??? ??? ??? ??? ?
- ?一旦完成三次握手,雙方都處于ESTABLISHED狀態(tài),此時(shí)連接就已建立完成,客戶端和服務(wù)端就可以相互發(fā)送數(shù)據(jù)了。
三次握手?jǐn)?shù)據(jù)丟失
(注意:ACK 報(bào)文是不會(huì)重傳的)
第一次握手丟失客戶端會(huì)重試5次后斷開
第二次握手丟失
? ???? 客戶端以為服務(wù)端沒收到所以進(jìn)行第一次握手動(dòng)作5次后斷開
?? ??? ?服務(wù)端會(huì)進(jìn)行第二次握手動(dòng)作五次會(huì)后斷開
第三次握手丟失(ACK 報(bào)文是不會(huì)重傳的)服務(wù)端會(huì)進(jìn)行第二次握手動(dòng)作五次后斷開?? ??? ??? ??? ?
?? ?
四次揮手
?第一次:客戶端請(qǐng)求斷開FIN,seq=u,之后客戶端進(jìn)入 FIN_WAIT_1 狀態(tài)。
第二次:服務(wù)器確認(rèn)客戶端的斷開請(qǐng)求ACK,ack=u+1,seq=v,接著服務(wù)端進(jìn)入 CLOSE_WAIT 狀態(tài);客戶端收到服務(wù)端的 ACK 應(yīng)答報(bào)文后,之后進(jìn)入 FIN_WAIT_2 狀態(tài)。
第三次:等待服務(wù)端處理完數(shù)據(jù)后,服務(wù)端請(qǐng)求斷開FIN,seq=w,ACK,ack=u+1,之后服務(wù)端進(jìn)入 LAST_ACK 狀態(tài)。
第四次:客戶端收到服務(wù)端的 FIN 報(bào)文后,回一個(gè) ACK 應(yīng)答報(bào)文:ACK,ack=w+1,seq=u+1,之后進(jìn)入 TIME_WAIT 狀態(tài)
服務(wù)端收到了 ACK 應(yīng)答報(bào)文后,就進(jìn)入了 CLOSE 狀態(tài),至此服務(wù)端已經(jīng)完成連接的關(guān)閉。
客戶端在經(jīng)過 2MSL 一段時(shí)間后,自動(dòng)進(jìn)入 CLOSE 狀態(tài),至此客戶端也完成連接的關(guān)閉。注意主動(dòng)關(guān)閉連接的,才有 TIME_WAIT 狀態(tài)。
?? ?
四次揮手時(shí)數(shù)據(jù)丟失
第一次揮手丟失
?? ??? ?當(dāng)客戶端(主動(dòng)關(guān)閉方)調(diào)用 close 函數(shù)后,就會(huì)向服務(wù)端發(fā)送 FIN 報(bào)文,試圖與服務(wù)端斷開連接,此時(shí)客戶端的連接進(jìn)入到 FIN_WAIT_1 狀態(tài)。正常情況下,如果能及時(shí)收到服務(wù)端(被動(dòng)關(guān)閉方)的 ACK,則會(huì)很快變?yōu)?FIN_WAIT2狀態(tài)。如果第一次揮手丟失了,那么客戶端遲遲收不到被動(dòng)方的 ACK 的話,也就會(huì)觸發(fā)超時(shí)重傳機(jī)制,重傳 FIN 報(bào)文,重發(fā)次數(shù)由 tcp_orphan_retries 參數(shù)控制。
當(dāng)客戶端重傳 FIN 報(bào)文的次數(shù)超過 tcp_orphan_retries 后,就不再發(fā)送 FIN 報(bào)文,則會(huì)在等待一段時(shí)間(時(shí)間為上一次超時(shí)時(shí)間的 2 倍),如果還是沒能收到第二次揮手,那么直接斷開連接。
第二次揮手丟失
?? ??? ?因?yàn)锳CK報(bào)文是不會(huì)重傳的所以如果服務(wù)端的第二次揮手丟失了,客戶端就會(huì)觸發(fā)超時(shí)重傳機(jī)制,重傳 FIN 報(bào)文,直到收到服務(wù)端的第二次揮手,或者達(dá)到最大的重傳次數(shù)等待一段時(shí)間后斷開。
第三次揮手丟失
?? ??? ?服務(wù)端:當(dāng)服務(wù)端(被動(dòng)關(guān)閉方)收到客戶端(主動(dòng)關(guān)閉方)的 FIN 報(bào)文后,內(nèi)核會(huì)自動(dòng)回復(fù) ACK,同時(shí)連接處于 CLOSE_WAIT 狀態(tài),顧名思義,它表示等待應(yīng)用進(jìn)程調(diào)用 close 函數(shù)關(guān)閉連接。此時(shí),內(nèi)核是沒有權(quán)利替代進(jìn)程關(guān)閉連接,必須由進(jìn)程主動(dòng)調(diào)用 close 函數(shù)來觸發(fā)服務(wù)端發(fā)送 FIN 報(bào)文。服務(wù)端處于 CLOSE_WAIT 狀態(tài)時(shí),調(diào)用了 close 函數(shù),內(nèi)核就會(huì)發(fā)出 FIN 報(bào)文,同時(shí)連接進(jìn)入 LAST_ACK 狀態(tài),等待客戶端返回 ACK 來確認(rèn)連接關(guān)閉。如果遲遲收不到這個(gè) ACK,服務(wù)端就會(huì)重發(fā) FIN 報(bào)文,重發(fā)次數(shù)仍然由 tcp_orphan_retries 參數(shù)控制,這與客戶端重發(fā) FIN 報(bào)文的重傳次數(shù)控制方式是一樣的。當(dāng)服務(wù)端重傳第三次揮手報(bào)文的次數(shù)達(dá)到了 3 次后,由于 tcp_orphan_retries 為 3,達(dá)到了重傳最大次數(shù),于是再等待一段時(shí)間(時(shí)間為上一次超時(shí)時(shí)間的 2 倍),如果還是沒能收到客戶端的第四次揮手(ACK報(bào)文),那么服務(wù)端就會(huì)斷開連接。
?? ??? ?客戶端:客戶端因?yàn)槭峭ㄟ^ close 函數(shù)關(guān)閉連接的,處于 FIN_WAIT_2 狀態(tài)是有時(shí)長(zhǎng)限制的,如果 tcp_fin_timeout 時(shí)間內(nèi)還是沒能收到服務(wù)端的第三次揮手(FIN 報(bào)文),那么客戶端就會(huì)斷開連接。
第四次揮手丟失
?? ??? ?客戶端:當(dāng)客戶端收到服務(wù)端的第三次揮手的 FIN 報(bào)文后,就會(huì)回 ACK 報(bào)文,也就是第四次揮手,此時(shí)客戶端連接進(jìn)入 TIME_WAIT 狀態(tài)。在 Linux 系統(tǒng),TIME_WAIT 狀態(tài)會(huì)持續(xù) 2MSL 后才會(huì)進(jìn)入關(guān)閉狀態(tài)。
?? ??? ?服務(wù)端:服務(wù)端(被動(dòng)關(guān)閉方)沒有收到 ACK 報(bào)文前,還是處于 LAST_ACK 狀態(tài)。如果第四次揮手的 ACK 報(bào)文沒有到達(dá)服務(wù)端,服務(wù)端就會(huì)重發(fā) FIN 報(bào)文,重發(fā)次數(shù)仍然由前面介紹過的 tcp_orphan_retries 參數(shù)控制。當(dāng)服務(wù)端重傳第三次揮手報(bào)文達(dá)到 2 時(shí),由于 tcp_orphan_retries 為 2, 達(dá)到了最大重傳次數(shù),于是再等待一段時(shí)間(時(shí)間為上一次超時(shí)時(shí)間的 2 倍),如果還是沒能收到客戶端的第四次揮手(ACK 報(bào)文),那么服務(wù)端就會(huì)斷開連接。
TCP最大連接數(shù)與文件打開數(shù)限制
源地址和目的地址的字段(32位)是在 IP 頭部中,作用是通過 IP 協(xié)議發(fā)送報(bào)文給對(duì)方主機(jī)。
源端口和目的端口的字段(16位)是在 TCP 頭部中,作用是告訴 TCP 協(xié)議應(yīng)該把報(bào)文發(fā)給哪個(gè)進(jìn)程。
因此,客戶端 IP 和 端口是可變的,其理論值計(jì)算公式如下:
????????最大TCP連接數(shù) = 客戶端的IP數(shù) × 客戶端的端口數(shù)
????????對(duì) IPv4,客戶端的 IP 數(shù)最多為 2 的 32 次方,客戶端的端口數(shù)最多為 2 的 16 次方,也就是服務(wù)端單機(jī)最大 TCP 連接數(shù),約為 2 的 48 次方。
服務(wù)端最大并發(fā) TCP 連接數(shù)遠(yuǎn)不能達(dá)到理論上限,會(huì)受以下因素影響:
?? ?(1)文件描述符限制
?? ?每個(gè) TCP 連接都是一個(gè)文件,如果文件描述符被占滿了,會(huì)發(fā)生 too many open files。Linux 對(duì)可打開的文件描述符的數(shù)量分別作了三個(gè)方面的限制:
?? ??? ?系統(tǒng)級(jí):當(dāng)前系統(tǒng)可打開的最大數(shù)量,通過 cat /proc/sys/fs/file-max 查看;
?? ??? ?用戶級(jí):指定用戶可打開的最大數(shù)量,通過 cat /etc/security/limits.conf 查看;
??????????????? 注意有時(shí)候例如使用自動(dòng)化工具salt遠(yuǎn)程啟動(dòng)進(jìn)行可能讀取不到此配置,可以通過命令:“cat /proc/PID/limits“ 查看進(jìn)程已生效的文件打開數(shù)是多少。(如果需要salt遠(yuǎn)程啟動(dòng)進(jìn)程時(shí)的進(jìn)程文件打開數(shù)設(shè)置符合預(yù)期可以vim /usr/lib/systemd/system/salt-minion.service 中添加 LimitNOFILE=65535,然后systemctl restart salt-minion重啟)
?? ??? ?進(jìn)程級(jí):?jiǎn)蝹€(gè)進(jìn)程可打開的最大數(shù)量,通過 cat /proc/sys/fs/nr_open 查看;
??? (2)id的上限制
?? ??? ??? ?vim /etc/sysctl.conf
?? ??? ??? ??? ?kernel.pid_max = 1000000
?? ??? ??? ?cat /proc/sys/kernel/pid_max
?? ?(2)內(nèi)存限制,每個(gè) TCP 連接都要占用一定內(nèi)存,操作系統(tǒng)的內(nèi)存是有限的,如果內(nèi)存資源被占滿后,會(huì)發(fā)生 OOM。
keepalive機(jī)制
- 長(zhǎng)連接與短連接的區(qū)別
????????操作方式不同。長(zhǎng)連接是指在客戶端和服務(wù)器之間保持一個(gè)持久的連接,數(shù)據(jù)可以隨時(shí)在兩者之間傳輸,無需每次都建立新的連接;短連接是指在每次數(shù)據(jù)傳輸完成后立即關(guān)閉連接,不會(huì)保持長(zhǎng)時(shí)間的連接狀態(tài)。
????????資源消耗不同。長(zhǎng)連接雖然提高了通信效率和穩(wěn)定性,但會(huì)持續(xù)占用資源;短連接在每次數(shù)據(jù)傳輸后斷開,可以節(jié)省資源,但在頻繁傳輸數(shù)據(jù)時(shí)會(huì)導(dǎo)致額外的開銷。
????????適用場(chǎng)景不同。長(zhǎng)連接適用于需要實(shí)時(shí)通信和長(zhǎng)時(shí)間保持連接的場(chǎng)景,如聊天室、實(shí)時(shí)游戲、數(shù)據(jù)庫連接等;短連接適用于一次性或數(shù)據(jù)刷新頻度較低的場(chǎng)景,如網(wǎng)頁瀏覽、HTTP請(qǐng)求等。
- TCP?;顧C(jī)制
????????定義一個(gè)時(shí)間段,在這個(gè)時(shí)間段內(nèi),如果沒有任何連接相關(guān)的活動(dòng),TCP ?;顧C(jī)制會(huì)開始作用,每隔一個(gè)時(shí)間間隔,發(fā)送一個(gè)探測(cè)報(bào)文,該探測(cè)報(bào)文包含的數(shù)據(jù)非常少,如果連續(xù)幾個(gè)探測(cè)報(bào)文都沒有得到響應(yīng),則認(rèn)為當(dāng)前的 TCP 連接已經(jīng)死亡,系統(tǒng)內(nèi)核將錯(cuò)誤信息通知給上層應(yīng)用程序。
????????如果開啟了 TCP ?;睿枰紤]以下幾種情況:
?? ??? ?????????第一種,對(duì)端程序是正常工作的。當(dāng) TCP 保活的探測(cè)報(bào)文發(fā)送給對(duì)端, 對(duì)端會(huì)正常響應(yīng),這樣 TCP ?;顣r(shí)間會(huì)被重置,等待下一個(gè) TCP 保活時(shí)間的到來。
?? ??? ?????????第二種,對(duì)端程序崩潰并重啟。當(dāng) TCP ?;畹奶綔y(cè)報(bào)文發(fā)送給對(duì)端后,對(duì)端是可以響應(yīng)的,但由于沒有該連接的有效信息,會(huì)產(chǎn)生一個(gè) RST 報(bào)文,這樣很快就會(huì)發(fā)現(xiàn) TCP 連接已經(jīng)被重置。
?? ??? ?????????第三種,是對(duì)端程序崩潰,或?qū)Χ擞捎谄渌驅(qū)е聢?bào)文不可達(dá)。當(dāng) TCP 保活的探測(cè)報(bào)文發(fā)送給對(duì)端后,石沉大海,沒有響應(yīng),連續(xù)幾次,達(dá)到?;钐綔y(cè)次數(shù)后,TCP 會(huì)報(bào)告該 TCP 連接已經(jīng)死亡。
- keepalive
????????TCP ?;畹倪@個(gè)機(jī)制檢測(cè)的時(shí)間是有點(diǎn)長(zhǎng),我們可以自己在應(yīng)用層實(shí)現(xiàn)一個(gè)心跳機(jī)制。比如,web 服務(wù)軟件一般都會(huì)提供 keepalive_timeout 參數(shù),用來指定 HTTP 長(zhǎng)連接的超時(shí)時(shí)間。如果設(shè)置了 HTTP 長(zhǎng)連接的超時(shí)時(shí)間是 50 秒,web 服務(wù)軟件就會(huì)啟動(dòng)一個(gè)定時(shí)器,如果客戶端在完成一個(gè) HTTP 請(qǐng)求后,在 50 秒內(nèi)都沒有再發(fā)起新的請(qǐng)求,定時(shí)器的時(shí)間一到,就會(huì)觸發(fā)回調(diào)函數(shù)來釋放該連接。在一個(gè)連接上執(zhí)行多個(gè)請(qǐng)求,這個(gè)就是所謂的長(zhǎng)連接。(注意:keepalive是tcp層長(zhǎng)連接探活機(jī)制;keep-alive是應(yīng)用層http協(xié)議使用,在其頭部Connection字段中的一個(gè)值,只是代表客戶端與服務(wù)之間需要保持長(zhǎng)連接,可以理解為通過此字段來告訴nginx此連接需要維持長(zhǎng)連接,處理完別直接關(guān)閉連接。)
- 是否可使用長(zhǎng)連接的條件是什么?
????????客服端的請(qǐng)求頭中的connection為close,則客戶端要求不使用長(zhǎng)連接。
????????客戶端的請(qǐng)求頭中的connection為keep-alive,則客戶端要求使用長(zhǎng)連接。
????????客戶端的請(qǐng)求頭中沒有connection這個(gè)頭,如果是http1.0協(xié)議默認(rèn)為close,如果是http1.1協(xié)議默認(rèn)為keep-alive
- keepalive_timeout
????????長(zhǎng)連接時(shí),Nginx在輸出完響應(yīng)體后,會(huì)設(shè)置當(dāng)前連接的keepalive屬性,然后等待客戶端的下一次請(qǐng)求,同時(shí)也設(shè)置了一個(gè)最大等待時(shí)間,這個(gè)時(shí)間通過keepalive_timeout來配置,如果是0,則表示關(guān)掉長(zhǎng)連接,此時(shí)不管客戶端的connection值是什么都會(huì)強(qiáng)制設(shè)為close。
tcpdump命令使用詳解
參考文檔:https://www.cnblogs.com/howhy/p/6396664.html
wireshark抓包分析工具的安裝與使用
Wireshark安裝下載
下載地址:http://wireshark.org/download.
windos安裝Wireshark
-
以管理員身份運(yùn)行安裝包。
-
這里第二個(gè)選項(xiàng)為創(chuàng)建桌面圖標(biāo),可按照自己的情況選擇,其余的保持默認(rèn)。
-
安裝路徑選擇。
-
這里需要安裝NPcap,如果電腦上已安裝的可忽略。
-
這里需要安裝USBPcap,如果電腦上已安裝的可以忽略。
wireshark的使用
包內(nèi)容界面介紹
tcp包的具體內(nèi)容
文章來源:http://www.zghlxwxcb.cn/news/detail-855271.html
報(bào)文錯(cuò)誤分析參考文檔:https://blog.csdn.net/qq_43148894/article/details/120038136文章來源地址http://www.zghlxwxcb.cn/news/detail-855271.html
到了這里,關(guān)于TCP報(bào)文與三次握手四次斷開、TCP最大連接數(shù)與文件打開數(shù)限制、keepalive、tcpdump、wireshark抓包分析工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!