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