1.OSI七層模型和TCP/IP四層模型
OSI參考模型主要由七層架構組成,分別是:
-
物理層: 主要包括一些
物理標準設備
,如網線接口類型、光纖接口類型、各種傳輸介質速率等。主要作用是傳輸比特流
。這一層的數據叫做比特
-
數據鏈路層: 主要從物理層接受的數據進行
MAC地址(網卡地址)
的封裝與解封。這一層的設備叫交換機
,數據通過交換機
來傳輸。 -
網絡層: 下層接收到的
數據進行IP地址的封裝與解封裝
。這一層工作得設備是路由器
,這一層的數據叫數據包
-
傳輸層: 定義了一些
傳輸數據的協議和端口號
,如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。
。主要是將下層數據進行分段傳輸,到達目的地後進行重組。這一層的數據叫段
。 -
會話層: 通過
傳輸層
建立數據傳輸的通路。主要在你的系統之間發起會話或者接受會話請求。 -
表示層: 主要對接收到的數據進行
解釋、加密和解密、壓縮與解壓縮
。 -
應用層: 主要是一些
終端的應用
,如FTP,WEB,QQ之類的。
TCP/IP四層模型分別是:
應用層: 參考於OSI參考模型的高層,爲用戶提供所需要的各種服務,如FTP、Tenlnet、DNS、SMTP
等。
傳輸層: 對應與OSI參考模型的傳輸層,爲應用層提供端到端的通訊功能,保證了數據包的順序傳送和數據的完整性。主要定義了TCP
和UDP
協議。
網絡層: 網際互聯層對應於OSI參考模型的網絡層,主要解決主機到主機的通信問題。該層協議有IP協議、地址解析協議(ARP)、互聯網管理協議(IGMP)和互聯網控制報文協議(ICMP)。
IP協議是網際互聯層最重要的協議,它提供的是一個不可靠、無連接的數據報傳遞服務。
網絡接口層: 網絡接入層與OSI參考模型中的物理層和數據鏈路層相對應。它負責監視數據在主機和網絡之間的交換。
OSI七層網絡模型 |
TCP/IP四層概念模型 |
對應網絡協議 |
應用層(Application) |
應用層 |
HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示層(Presentation) |
Telnet, Rlogin, SNMP, Gopher |
|
會話層(Session) |
SMTP, DNS |
|
傳輸層(Transport) |
傳輸層 |
TCP, UDP |
網絡層(Network) |
網絡層 |
IP, ICMP, ARP, RARP, AKP, UUCP |
數據鏈路層(Data Link) |
網絡接口層 |
FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理層(Physical) |
IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
優點:
- 把複雜網絡分成更容易管理的層(複雜問題劃分成若干個小問題)
- 沒有一個廠商能夠提供全套完成的解決方案和所有的設備、協議
- 分工明確,上層不關心下層下層細節
2. TCP 協議
2.1 TCP長連接和短鏈接
TCP在真正的讀寫操作之前,server和client必須建立一個連接,當讀寫操作完成後,雙方不再需要這個連接時它們可以釋放這個連接。連接的建立通過三次握手,釋放需要四次揮手。所以說每建立一個連接都是需要消耗資源和時間的。
TCP短鏈接
短鏈接步驟:client向server發送連接請求 -> server接到請求 -> client向server發送消息 -> server迴應client -> 一次讀寫完成,一般由client發起close操作。
短連接之間一般只會在client/server之間傳遞一次讀寫操作。
TCP長鏈接
長鏈接步驟:client向server發送連接請求 -> server接到請求 -> client向server發送消息 -> server迴應client -> 一次讀寫完成,連接不關閉 -> 後續讀寫操作 -> 一般由client發起close操作
。
各自優缺點以及應用場景
- 長連接可以省去較多的TCP建立和關閉的操作,減少浪費,節約時間。對於頻繁請求資源的客戶來說,較適用長連接。
- client和server之間連接一直不關閉的話,會導致客戶端連接越來越多,導致server壓力過大。這時server會採用一些策略,關閉一些較長沒有IO時間的連接等。
- 短鏈接對於服務器比較簡單,存在的連接都是有用連接,不需要額外手段。但如果請求頻繁,在建立和關閉連接上會浪費資源。
長連接適用場景:監控系統、即時通訊系統、數據庫連接
短鏈接使用場景:Http服務
2.2 TCP三次握手和四次揮手
-
序列號
SEQ
:佔4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;給字節編上序號後,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節的數據編號。 -
確認序號
ack
:佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,ack=seq+1。 -
確認標誌位
ACK
:佔1位,確認序號有效。 -
同步
SYN
:連接建立時用於同步序號。當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連接請求,或連接接受報文。SYN這個標誌位只有在TCP建產連接時纔會被置1,握手完成後SYN標誌位被置0。 -
終止
FIN
:用來釋放一個連接。FIN=1表示:此報文段的發送方的數據已經發送完畢,並要求釋放運輸連接
2.2.1 三次握手
第一次握手: 客戶端發送第一個包,其中SYN標誌位爲1, ACK=0,發送順序號sequence=X(隨機int)。客戶端進入SYN發送狀態,等待服務器確認。
第二次握手: 服務器收到這個包後發送第二個包,其中包SYN、ACK標誌位爲x+1,發送順序號seq=Y(隨機int),接收順序號ACK=X+1,此時服務器進入SYN接收狀態。
第三次握手: 客戶端收到服務器傳來的包後,向服務器發送第三個包,SYN=0, ACK=Y+1,接收順序號ACK = Y+1,發送順序號seq=X+1。此包發送完畢,客戶端和服務器進入ESTABLISHED建立成功狀態,完成三次握手。
問題:爲什麼不能用兩次握手進行連接?
答:3次握手完成兩個重要的功能,既要雙方做好發送數據的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被髮送和確認。
問題:如果已經建立了連接,但是客戶端突然出現故障了怎麼辦?
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設置爲2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以後每隔75秒鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認爲客戶端出了故障,接着就關閉連接。
2.2.2 四次揮手
四次揮手是指終止TCP連接協議時,需要在客戶端和服務器之間發送四個包
第一次揮手: 主動關閉方發送第一個包,其中FIN
標誌位爲1,發送順序號seq
爲X,ACK爲Z。
第二次揮手: 被動關閉方收到FIN包後發送第二個包,其中發送順序號seq
爲Z,接收順序號ack
爲X+1。
第三次揮手: 被動關閉方再發送第三個包,其中FIN標誌位爲1,發送順序號seq
爲Y,接收順序號ack
爲X。
第四次揮手: 主動關閉方發送第四個包,其中發送順序號seq
爲X,接收順序號ack
爲Y + 1。至此,完成四次揮手。
超時重傳指的是,發送數據包在一定的時間週期內沒有收到相應的ACK,等待一定的時間,超時之後就認爲這個數據包丟失,就會重新發送。這個等待時間被稱爲RTO.
問題:爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?
建立連接時,ACK和SYN可以放在一個報文裏來發送。而關閉連接時,被動關閉方可能還需要發送一些數據後,再發送FIN報文表示同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。
爲什麼TIME_WAIT狀態還需要等2MSL後才能返回到CLOSED狀態?
兩個存在的理由:1、無法保證最後發送的ACK報文會一定被對方收到,所以需要重發可能丟失的ACK報文。2、關閉鏈接一段時間後可能會在相同的IP地址和端口建立新的連接,爲了防止舊連接的重複分組在新連接已經終止後再現。2MSL足以讓分組最多存活msl秒被丟棄。
2.3 TCP滑動窗口
窗口是緩存的一部分,用來暫時存放字節流。發送方和接收方何有一個窗口,接收方通過TCP報文段中的窗口字段告訴發送方自己的窗口大小,發送方根據這個值和其它信息設置自己的窗口大小。
發送窗口內的字節都允許被髮送,接收窗口內的字節都允許被接受。如果發送窗口左部的字節已經發送並且收到了確認,那麼將發送窗口向右滑動一定距離,直到左部第一個字節不是已發送並且已確認的狀態;接受窗口的滑動類似,接受窗口左部字節已經發送確認並交付主機,就向滑動接受窗口。
2.4 UDP協議和TCP協議的區別
UDP又稱無連接協議, 主要用於如下:
特徵點 | TCP | UDP |
---|---|---|
是否連接 | 面向連接 | 非連接 |
傳輸可靠性 | 可靠 | 會丟包,不可靠 |
應用場景 | 傳輸數據量大 | 傳輸量小 |
速度 | 慢 | 快 |