?關鍵詞:
OSI是Open System Interconnect的縮寫,意為開放式系統互聯。
RTT : Round-Trip time 往返時間
RTO:Retransmission Timeout超時重傳時間
MSL :?
OSI 七層模型和 TCP/IP 四層模型
OSI七層模型和TCP/IP五層模型(原來應該是四層,新版教程改成五層)的映射關系,以及對應的功能和協議:
OSI七層模型 | TCP/IP五層模型 | 對應網絡協議 | 功能 |
---|---|---|---|
應用層(Application) | 應用層(Application) | HTTP、TFTP, FTP, NFS, WAIS、SMTP | 文本傳輸、電子郵件、文件服務、虛擬終端等 |
表示層(Presentation) | Telnet, Rlogin, SNMP, Gopher | 數據格式化、代碼轉換、數據加密 | |
會話層(Session) | SMTP, DNS | 解除/建立與別的連接點的Connection | |
傳輸層(Transport) | 傳輸層(Transport) | TCP, UDP | 提供端對端接口 |
網絡層(Network) | 網絡層(Network) | IP, ICMP, ARP, RARP, AKP, UUCP | 為數據包提供路由選擇 |
數據鏈路層(Data Link) | 數據鏈路層(Data Link) | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP | 傳輸帶地址的幀、提供錯誤檢測功能 |
物理層(Physical) | 物理層(Physical) | IEEE 802.1A, IEEE 802.2到IEEE 802.11 | 以二進制數據形式在物理媒介上傳輸數據 |
無論哪種模型,都可以看出來,四層是指傳輸層,七層是指應用層。
TCP三次握手四次揮手
TCP是面向連接的,所有的連接是指雙方都確認了連接的建立。
三次握手
我們來看一下三次握手的過程:
- 一開始,客戶端和服務端都處于?
CLOSED
?狀態。客戶端主動打開連接,服務端被動打卡連接,結束CLOSED
?狀態,開始監聽,進入?LISTEN
狀態。
一次握手
客戶端會隨機初始化序號(client_isn
),
- 將此序號置于 TCP 首部的「序號」字段中,
- 同時把?
SYN
?標志位置為?1
?,表示?SYN
?報文。
接著把第一個 SYN 報文發送給服務端,表示向服務端發起連接。該報文不包含應用層數據,之后客戶端處于?SYN-SENT
?狀態。
二次握手
服務端收到客戶端的?SYN
?報文后,首先服務端也隨機初始化自己的序號(server_isn
),
- 將此序號填入 TCP 首部的「序號」字段中,
- 其次把 TCP 首部的「確認應答號」字段填入?
client_isn + 1
, - 接著把?
SYN
?和?ACK
?標志位置為?1
最后把該報文發給客戶端,該報文也不包含應用層數據,之后服務端處于?SYN-RCVD
?狀態。
三次握手
客戶端收到服務端報文后,還要向服務端回應最后一個應答報文,
- 首先該應答報文 TCP 首部?
ACK
?標志位置為?1
?, - 其次「確認應答號」字段填入?
server_isn + 1
?,
最后把報文發送給服務端,這次報文可以攜帶客戶到服務器的數據,之后客戶端處于?ESTABLISHED
?狀態。
好了,經過三次握手的過程,客戶端和服務端之間的確定連接正常,接下來進入ESTABLISHED
狀態,服務端和客戶端就可以快樂地通信了。
問題:為什么是三次,不是兩次、四次?
兩次:如果只有前兩次,服務端會認為連接已經建立,如果客戶端后續不在發送報文,也就是客戶端不認可這個鏈接,相當于這個連接資源浪費了。
四次:三次就可以完成雙方的確認,沒有必要多進行一次。
四次揮手
一次揮手
- 客戶端打算關閉連接,此時會發送一個 TCP 首部?
FIN
?標志位被置為?1
?的報文,也即?FIN
?報文,之后客戶端進入?FIN_WAIT_1
?狀態。
二次揮手
- 服務端收到該報文后,就向客戶端發送?
ACK
?應答報文,接著服務端進入?CLOSED_WAIT
?狀態。
三次揮手
- 客戶端收到服務端的?
ACK
?應答報文后,之后進入?FIN_WAIT_2
?狀態。等待服務端處理完數據后,也向客戶端發送?FIN
?報文,之后服務端進入?LAST_ACK
?狀態。
四次揮手
- 客戶端收到服務端的?
FIN
?報文后,回一個?ACK
?應答報文,之后進入?TIME_WAIT
?狀態 - 服務器收到了?
ACK
?應答報文后,就進入了?CLOSED
?狀態,至此服務端已經完成連接的關閉。 - 客戶端在經過?
2MSL
?一段時間后,自動進入?CLOSED
?狀態,至此客戶端也完成連接的關閉。
可以看到,每個方向都需要一個 FIN 和一個 ACK,因此通常被稱為四次揮手。
問題:為什么是四次,不是三次?
三次:如果是三次,需要將服務端的ACK和FIN包合成一次發送,但是服務端在收到客戶端的FIN包后,需要釋放資源等各種善后操作,這個會比較浪費時間,導致給客戶端端的響應時間超時,從而導致客戶端重發FIN包。 所以將服務端的ACK和FIN分開發送。
思考:為什么握手需要經過雙方對彼此的確認, 而揮手只需要一方對另一方的確認就可以了呢?
握手需要雙方對彼此的確認,是要保證連接得到雙方認可(不浪費);揮手其實也是雙方對彼此的確認, 只不過是分兩階段進行的。
TCP與UDP
TCP是一個面向連接的、可靠的、基于字節流的傳輸層協議。
UDP是一個面向無連接的傳輸層協議。
面向連接:指的是客戶端和服務端建立連接,在雙方相互通信之前,TCP需要三次握手建立連接,而UDP沒有建立連接的過程。
可靠性:TCP花了很多的功夫保障連接的可靠性
- TCP有狀態:TCP會進準記錄哪些數據發送了,哪些數據被對方接受了,哪些沒有被接受,而且保證數據包按序到達,不允許半點差錯。
- TCP可空:意識到丟包了或者網絡環境不佳,TCP會根據情況調整自己的行為,控制自己的發送速度或者重發。
報文中的序列號
凡是對端的確認都需要序列號,防止端發送重復的報文。這樣也使得調用有順序性。
TCP中的端口號
端口號位于傳輸層的TCP報文頭中。端口號用兩個字節表示,最大值65535
1. 熟知的端口號:0~1023
- HTTP: 80
- HTTPS: 443
- FTP: 21
- SSH: 22
- Telnet: 23
- SMTP: 25
- DNS: 53
2. 已登記的端口號:1024~49151
- MySQL: 3306
- Oracle DB: 1521
- Redis: 6379
- MongoDB: 27017
- Tomcat: 8080
3. 臨時端口號:49152~65535?
????????你的瀏覽器在訪問網站時,操作系統會隨機分配這個范圍內的一個端口作為源端口。
telnet用法
1. telnet ip/domianName??port :遠端這個地址下的這個端口是否可以訪問
2. telnet 發送http請求
輸入紅框里的內容, 發送http請求,就會得到http的響應
curl? 命令同樣可以訪問網絡域名
netstat
> netstat -at
> netstat -au
tcpdump
是一個命令行的網絡流量分析工具,功能非常強大,一般用于抓TCP的包。
tcpdump -i any host 180.101.49.44
- tcpdump 抓包
- -i? 在機器的網卡上抓包
- any 任意網卡
- 180.101.49.44? 某次測試時百度的地址
?參考:
1.?深入分析四層/七層網關 - Hello-Brand - 博客園
2.?“三次握手,四次揮手”這么講,保證你忘不了 - 三分惡 - 博客園