TCP/IP
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的 可靠的常遂、基于字節(jié)流的傳輸層通信協(xié)議
UDP是User Datagram Protocol的簡(jiǎn)稱绍在, 中文名是用戶數(shù)據(jù)報(bào)協(xié)議,是一種無連接的傳輸層協(xié)議
TCP 傳輸控制協(xié)議? 面向連接的協(xié)議(同步傳輸)? 可靠傳輸協(xié)議?? 傳輸效率低 ?na
UDP用戶報(bào)文協(xié)議? 無連接協(xié)議? ? (異步傳輸)? 不可靠傳輸協(xié)議 傳輸效率高
系統(tǒng)中:
異步傳輸數(shù)據(jù): 類似離線傳輸? 不需要進(jìn)行確認(rèn)?
? ? 優(yōu)點(diǎn): 傳輸效率較高
缺點(diǎn): 安全性不高
同步傳輸數(shù)據(jù): 類似在線傳輸? 需要進(jìn)行確認(rèn)
? ? 優(yōu)點(diǎn): 安全性高
缺點(diǎn): 傳輸效率較低
1.TCP協(xié)議中重要原理
1) TCP三次握手過程-- 完成網(wǎng)絡(luò)連接建立
?? TCP報(bào)文結(jié)構(gòu):
?? a 源端口地址? ? 返回?cái)?shù)據(jù)包目標(biāo)端口地址?
?? b 目標(biāo)端口地址? 要和服務(wù)端哪個(gè)網(wǎng)絡(luò)服務(wù)建立連接
?? 端口的數(shù)值范圍: 1-65535 是通過報(bào)文結(jié)構(gòu)獲知的
?? 根據(jù)報(bào)文結(jié)構(gòu) 源端口和目標(biāo)端口各占用16個(gè)bit
?? 公式: 2的n次方 n占用了多少比特
?? 占用了1bit
?? 端口范圍: 0 1? 2種?? 2的1次方=2 0-1? ? ? ?
?? 占用了2bit
?? 端口范圍: 00(0) 01(1) 10(2) 11(3) 4種?? 2的2次方=4 0-3
?? 占用了3bit
?? 端口范圍: 000(0) 001(1) 010(2) 011(3) 100(4) 101(5) 110(6) 111(7)? 8種 2的3次方=8 0-7
?? 占用了16bit
?? 端口范圍: 2的16次方=65536? 0-65535 --- 1-65535
?? PS: 一般0號(hào)端口不被使用
?? c Sequence Number(序列號(hào))
?? d Acknowledgement Number(確認(rèn)號(hào))
?? 特殊6bit作為報(bào)文結(jié)構(gòu)中的控制位:
?? syn(連接)?? --- 請(qǐng)求建立連接控制字段
?? ack(確認(rèn))?? --- 表示確認(rèn)控制字段
?? fin(斷開)?? --- 請(qǐng)求斷開連接控制字段
?? 說明: 控制字段數(shù)值置為1表示控制功能開啟 默認(rèn)為0
?? 三次握手詳細(xì)過程:
?? 第一次握手: 發(fā)送TCP數(shù)據(jù)報(bào)文 客戶端 -- 服務(wù)端
? ? ? ? ? ? ?? a TCP數(shù)據(jù)報(bào)文中,需要將syn控制字段改為1
?????????????? b TCP數(shù)據(jù)報(bào)文中,需要將seq序列號(hào)信息發(fā)出 seq=x
?? 第二次握手: 發(fā)送TCP數(shù)據(jù)報(bào)文 服務(wù)端 -- 客戶端
? ? ? ? ? ? ? ?a TCP數(shù)據(jù)報(bào)文中,需要將ack控制字段改為1
? ? ? ? ? ?????b TCP數(shù)據(jù)報(bào)文中,同時(shí)將syn控制字段改為1
?????????????? c TCP數(shù)據(jù)報(bào)文中,同時(shí)將ack確認(rèn)號(hào)信息發(fā)出 ack=x+1
?????????????? d TCP數(shù)據(jù)報(bào)文中,同時(shí)將seq序列號(hào)信息發(fā)出 seq=y
?? 第三次握手: 發(fā)送TCP數(shù)據(jù)報(bào)文 客戶端 -- 服務(wù)端
? ? ? ? ? ? ?? a TCP數(shù)據(jù)報(bào)文中,需要將ack控制字段改為1
?????????????? b TCP數(shù)據(jù)報(bào)文中,同時(shí)將ack確認(rèn)號(hào)信息發(fā)出 ack=y+1
?????????????? c TCP數(shù)據(jù)報(bào)文中,同時(shí)將seq序列號(hào)信息發(fā)出 seq=x+1
2.TCP四次揮手過程?-- 完成網(wǎng)絡(luò)連接斷開
?? 第一次揮手: 發(fā)送TCP數(shù)據(jù)報(bào)文 客戶端 -- 服務(wù)端
? ? ? ? ? ? ?? a TCP數(shù)據(jù)報(bào)文中, 需要將fin控制字段改為1
?????????????? b TCP數(shù)據(jù)報(bào)文中, 同時(shí)將ack控制字段改為1
? ? ? ? ? ? ? ? ? ? 也包含seq和ack確認(rèn)號(hào)信息
?? 第二次揮手: 發(fā)送TCP數(shù)據(jù)報(bào)文 服務(wù)端 -- 客戶端
? ? ? ? ? ? ? ? ?a TCP數(shù)據(jù)報(bào)文中, 需要將ack控制字段改為1
?? 第三次揮手: 發(fā)送TCP數(shù)據(jù)報(bào)文 服務(wù)端 -- 客戶端
? ? ? ? ? ? ? ? ?? a TCP數(shù)據(jù)報(bào)文中, 需要將ack控制字段改為1 ?
? ? ? ? ? ? ? ? ?? b TCP數(shù)據(jù)報(bào)文中, 同時(shí)將fin控制字段改為1
?? 第四次揮手: 發(fā)送TCP數(shù)據(jù)報(bào)文 客戶端 -- 服務(wù)端
? ? ? ? ? ? ? ? ?? a TCP數(shù)據(jù)報(bào)文中, 需要將ack控制字段改為1
擴(kuò)展: 如何抓取網(wǎng)絡(luò)數(shù)據(jù)包(抓包軟件)?
windows: Wireshark
linux: tcpdump命令
3. TCP 11種狀態(tài)集轉(zhuǎn)換(了解 -- 架構(gòu)層面)
? ? 1) 以后可以更好排查系統(tǒng)網(wǎng)絡(luò)問題
? 2) 以后學(xué)習(xí)網(wǎng)絡(luò)編程會(huì)有幫助
TCP三次握手過程: 服務(wù)端和客戶端狀態(tài)變化(5種狀態(tài)變化)
? ? 第一歷程: 初始狀態(tài)信息
客戶端狀態(tài)為: closed
服務(wù)端狀態(tài)為: closed
第二歷程: 服務(wù)端開啟相應(yīng)服務(wù)
服務(wù)端狀態(tài)為: closed -- LISTEN
第三歷程: 發(fā)送建立連接請(qǐng)求(客戶端) == 三次握手第一次
客戶端發(fā)送syn信息
客戶端狀態(tài)為: closed -- syn_sent
第四歷程: 接收建立連接請(qǐng)求(服務(wù)端) == 三次握手第二次
服務(wù)端接受syn信息, 發(fā)送確認(rèn)以及請(qǐng)求建立連接信息(ack syn)
服務(wù)端狀態(tài)為: LISTEN -- syn_rcvd
? ? 第五歷程: 發(fā)送最后確認(rèn)信息(客戶端) == 三次握手第三次
? ? 客戶端發(fā)送ack信息
? ? 客戶端狀態(tài)為: syn_sent -- established
? ? 第六歷程: 接收最后確認(rèn)信息(服務(wù)端)
? ? 服務(wù)端接收ack信息
? ? 服務(wù)端狀態(tài)為: syn_rcvd -- established
? ? 結(jié)論: 只有服務(wù)端和客戶端都統(tǒng)一處于established連接建立狀態(tài), 才能正常傳輸數(shù)據(jù)信息
TCP四次揮手過程: 服務(wù)端和客戶端狀態(tài)變化(5種狀態(tài)變化)
第一個(gè)歷程: 初始狀態(tài)信息
客戶端狀態(tài)為: established
服務(wù)端狀態(tài)為: established
第二個(gè)歷程: 發(fā)送斷開連接請(qǐng)求(客戶端) == 四次揮手第一次
客戶端發(fā)送fin請(qǐng)求斷開連接字段
客戶端狀態(tài)為: established -- fin_wait1
第三個(gè)歷程: 接收斷開連接請(qǐng)求(服務(wù)端) == 四次揮手第二次
服務(wù)端接受fin請(qǐng)求斷開連接字段 發(fā)出確認(rèn)信息(ack=1)
服務(wù)端狀態(tài)為: established -- close_wait
第四個(gè)歷程: 接收確認(rèn)斷開信息(客戶端)
客戶端接受服務(wù)端發(fā)出的確認(rèn)信息(ack=1)
客戶端狀態(tài)為: fin_wait1 -- fin_wait2
第五個(gè)歷程: 發(fā)送斷開連接請(qǐng)求(服務(wù)端) == 四次揮手第三次
服務(wù)端發(fā)送fin請(qǐng)求斷開連接字段 同時(shí)還會(huì)再次發(fā)送確認(rèn)字段
服務(wù)端狀態(tài)為: close_wait -- last_ack
第六個(gè)歷程: 接收斷開連接請(qǐng)求(客戶端) 發(fā)送最后確認(rèn)信息 == 四次揮手第四次
客戶端接收斷開連接請(qǐng)求 同時(shí)發(fā)送最后確認(rèn)信息ack=1
客戶端狀態(tài)為: fin_wait2? -- time_wait (等時(shí)間 60s 90s 120s???)
第七個(gè)歷程: 接收最后確認(rèn)信息(服務(wù)端)
服務(wù)端狀態(tài)為: last_ack? -- closed
第八個(gè)歷程: 等待時(shí)間結(jié)束
客戶端狀態(tài)為: time_wait -- closed