一、OSI七層模型
OSI是Open SystemInterconnect的縮寫,意為開放式系統互聯。
OSI參考模型各個層次的劃分遵循下列原則:
根據不同層次的抽象分層
每層應當有一個定義明确的功能
每層功能的選擇應該有助于制定網絡協定的國際标準。
各層邊界的選擇應盡量節省跨過接口的通信量。
層數應足夠多,以避免不同的功能混雜在同一層中,但也不能太多,否則體系結構會過于龐大
同一層中的各網絡節點都有相同的層次結構,具有同樣的功能。
同一節點内相鄰層之間通過接口(可以是邏輯接口)進行通信。
七層結構中的每一層使用下一層提供的服務,并且向其上層提供服務。
不同節點的同等層按照協定實作對等層之間的通信。
2、根據以上标準,OSI參考模型分為以下七層:
7應用層
6表示層
5會話層
4傳輸層
3網絡層
2資料鍊路層
1實體層
每層對因功能協定:

第7層-應用層 網絡程序通路應用層
為應用程式程序(電子郵件、檔案傳輸和終端仿真)提供網絡服務;
提供使用者身份驗證;
定義了用于在網絡中進行通信和資料傳輸的接口 - 使用者程式;
提供标準服務,比如虛拟終端、檔案以及任務的傳輸和處理;
應用層為作業系統或網絡應用程式提供通路網絡服務的接口;
第6層-表示層 資料表示
確定接收系統可以讀出該資料;格式化資料;建構資料;
協商用于應用層的資料傳輸文法;
提供加密;
掩蓋不同系統間的資料格式的不同性;
這一層主要解決擁護資訊的文法表示問題。它将欲交換的資料從适合于某一使用者的抽象文法,轉換為适合于OSI系統内部使用的傳送文法。即提供格式化的表示和轉換資料服務。資料的壓縮和解壓縮,加密和解密等工作都由表示層負責。
第5層-會話層 主機間通信
建立、管理和終止在應用程式之間的會話;
控制使用者間邏輯連接配接的建立和挂斷;
報告上一層發生的錯誤;
這一層也可以稱為會晤層或對話層,在會話層及以上的高層次中,資料傳送的機關不再另外命名,而是統稱為封包。會話層不參與具體的傳輸,它提供包括通路驗證和會話管理在内的建立和維護應用之間通信的機制。如伺服器驗證使用者登入便是由會話層完成的。
第4層-傳輸層 傳輸問題
建立、維護和終止虛拟電路
資訊流控制來保障可靠性
管理網絡中端到端的資訊傳送;
通過錯誤糾正和流控制機制提供可靠且有序的資料包傳送;
提供面向無連 接的資料包的傳送;
第4層為上層提供端到端(最終使用者到最終使用者)的透明的、可靠的資料傳輸服務。所為透明的傳輸是指在通信過程中傳輸層對上層屏蔽了通信傳輸系統的具體細節。
第3層-網絡層 資料傳輸
選擇傳的資料的最佳路徑
支援邏輯尋址和路徑選擇
定義網絡裝置間如何傳輸資料;
根據唯一的網絡裝置位址路由資料包;
提供流和擁塞控制以防止網絡資源的損耗
在計算機網絡中進行通信的兩個計算機之間可能會經過很多個資料鍊路,也可能還要經過很多通信子網。網絡層的任務就是選擇合适的網間路由和交換結點,確定資料及時傳送。網絡層将資料鍊路層提供的幀組成資料包,包中封裝有網絡層標頭,其中含有邏輯位址資訊- -源站點和目的站點位址的網絡位址。如果你在談論一個IP位址,那麼你是在處理第3層的問題,這是“資料包”問題,而不是第2層的“幀”。IP是第3層問題的一部分,此外還有一些路由協定和位址解析協定(ARP)。有關路由的一切事情都在這第3層處理。位址解析和路由是3層的重要目的。網絡層還可以實作擁塞控制、網際互連等功能。在這一層,資料的機關稱為資料包(packet)。
第2層-資料鍊路層 通路媒體
定義如何格式化資料以便進行傳輸以及如何控制對網絡的通路
支援錯誤檢測
定義操作通信連接配接的程式;
封裝資料包為資料幀;
監測和糾正資料包傳輸錯誤
在實體層提供比特流服務的基礎上,建立相鄰結點之間的資料鍊路,通過差錯控制提供資料幀(Frame)在信道上無差錯的傳輸,并進行各電路上的動作系列。資料鍊路層在不可靠的實體媒體上提供可靠的傳輸。該層的作用包括:實體位址尋址、資料的成幀、流量控制、資料的檢錯、重發等。在這一層,資料的機關稱為幀(frame)。
第1層-實體層 二進制傳輸
為啟動、維護以及關閉實體鍊路定義了電氣規範、機械規範、過程規範和功能規範;
定義通過網絡裝置發送資料的實體方式;
作為網絡媒介和裝置間的接口;
規定通信裝置的機械的、電氣的、功能的和過程的特性,用以建立、維護和拆除實體鍊路連接配接。具體地講,機械特性規定了網絡連接配接時所需接插件的規格尺寸、引腳數量和排列情況等;電氣特性規定了在實體連接配接上傳輸bit流時線路上信号電平的大小、阻抗比對、傳輸速率距離限制等;功能特性是指對各個信号先配置設定确切的信号含義,即定義了DTE和DCE之間各個線路的功能;規程特性定義了利用信号線進行bit流傳輸的一組操作規程,是指在實體連接配接的建立、維護、交換資訊是,DTE和DCE雙放在各電路上的動作系列。在這一層,資料的機關稱為比特(bit)。
PDU: Protocol Data Unit,協定資料單元是指對等層次之間傳遞的資料機關
實體層的PDU是資料位 bit
資料鍊路層的PDU是資料幀 frame
網絡層的PDU是資料包 packet
傳輸層的PDU是資料段 segment
其他更高層次的PDU是消息 message
對等通信:
二、TCP/IP
TCP/IP(傳輸控制協定/網間網協定)是目前世界上應用最為廣泛的協定,它的流行與Internet的迅猛發展密切相關。
TCP/IP最初是為網際網路的原型ARPANET所設計的,目的是提供一整套友善實用、能應用于多種網絡上的協定,事實證明TCP/IP做到了這一點,它使網絡互聯變得容易起來,并且使越來越多的網絡加入其中,成為Internet的事實标準。
TCP/IP協定族包含了很多功能各異的子協定。為此我們也利用上文所述的分層的方式來剖析它的結構。共定義了四層,和ISO參考模型的分層有對應關系。
分層:
4 應用層
3 傳輸層
2 Internet層
1 網絡通路層
對應關系:
TCP(Transmission Control Protocol:傳輸控制協定)和UDP(UserDatagram Protocol:使用者資料報協定)協定屬于傳輸層協定。其中:
1)TCP提供IP環境下的資料可靠傳輸,它提供的服務包括資料流傳送、可靠性、有效流控、全雙工操作和多路複用。通過面向連接配接、端到端和可靠的資料包發送。通俗說,它是事先為所發送的資料開辟出連接配接好的通道,然後再進行資料發送;
2)UDP則不為IP提供可靠性、流控或差錯恢複功能。一般來說,TCP對應的是可靠性要求高的應用,而UDP對應的則是可靠性要求低、傳輸經濟的應用。
應用層
應用層是所有使用者所面向的應用程式的統稱。ICP/IP協定族在這一層面有着很多協定來支援不同的應用,許多大家所熟悉的基于Internet的應用的實作就離不開這些協定。如我們進行網際網路(WWW)通路用到了HTTP協定、檔案傳輸用FTP協定、電子郵件發送用SMTP、域名的解析用DNS協定、遠端登入用Telnet協定等等,都是屬于TCP/IP應用層的;就使用者而言,看到的是由一個個軟體所構築的大多為圖形化的操作界面,而實際背景運作的便是上述協定。
傳輸層
這一層的的功能主要是提供應用程式間的通信,TCP/IP協定族
在這一層的協定有TCP和UDP。
網絡層
TCP/IP協定族中非常關鍵的一層,主要定義了IP位址格式,進而能夠使得不同應用類型的資料在Internet上通暢地傳輸,IP協定就是一個網絡層協定。
網絡接口層
這是TCP/IP軟體的最低層,負責接收IP資料包并通過網絡發送之,或者從網絡上接收實體幀,抽出IP資料報,交給IP層。
TCP的標頭如圖:
源端口、目标端口:計算機上的程序要和其他程序通信是要通過計算機端口的,而一個計算機端口某個時刻隻能被一個程序占用,是以通過指定源端口和目标端口,就可以知道是哪兩個程序需要通信。源端口、目标端口是用16位表示的,可推算計算機的端口個數為2^16個。
序列号:表示本封包段所發送資料的第一個位元組的編号。在TCP連接配接中所傳送的位元組流的每一個位元組都會按順序編号。由于序列号由32位表示,是以每2^32個位元組,就會出現序列号回繞,再次從0開始。
确認号:表示接收方期望收到發送方下一個封包段的第一個位元組資料的編号。也就是告訴發送發:我希望你(指發送方)下次發送的資料的第一個位元組資料的編号是這個确認号。
資料偏移:表示TCP封包段的首部長度,共4位,由于TCP首部包含一個長度可變的選項部分,需要指定這個TCP封包段到底有多長。它指出 TCP 封包段的資料起始處距離TCP 封包段的起始處有多遠。該字段的機關是32位(即4個位元組為計算機關),4位二進制最大表示15,是以資料偏移也就是TCP首部最大60位元組。
URG:表示本封包段中發送的資料是否包含緊急資料。後面的緊急指針字段(urgent pointer)隻有當URG=1時才有效
ACK:表示是否前面的确認号字段是否有效。ACK=1,表示有效。隻有當ACK=1時,前面的确認号字段才有效。TCP規定,連接配接建立後,ACK必須為1,帶ACK标志的TCP封包段稱為确認封包段
PSH:判斷是否存到緩沖區。提示接收端應用程式應該立即從TCP接收緩沖區中讀走資料,為接收後續資料騰出空間。如果為1,則表示對方應當立即把資料送出給上層應用,而不是緩存起來,如果應用程式不将接收到的資料讀走,就會一直停留在TCP接收緩沖區中
RST:重建立立連接配接。如果收到一個RST=1的封包,說明與主機的連接配接出現了嚴重錯誤(如主機崩潰),必須釋放連接配接,然後再重建立立連接配接。或者說明上次發送給主機的資料有問題,主機拒絕響應,帶RST标志的TCP封包段稱為複位封包段
SYN:請求位。在建立連接配接時使用,用來同步序号。當SYN=1,ACK=0時,表示這是一個請求建立連接配接的封包段;當SYN=1,ACK=1時,表示對方同意建立連接配接。SYN=1,說明這是一個請求建立連接配接或同意建立連接配接的封包。隻有在前兩次握手中SYN才置為1,帶SYN标志的TCP封包段稱為同步封包段
FIN:分手位。表示通知對方本端要關閉連接配接了,标記資料是否發送完畢。如果FIN=1,即告訴對方:“我的資料已經發送完畢,你可以釋放連接配接了”,帶FIN标志的TCP封包段稱為結束封包段
視窗大小:表示現在充許對方發送的資料量,也就是告訴對方,從本封包段的确認号開始允許對方發送的資料量
校驗和:提供額外的可靠性
緊急指針:标記緊急資料在資料字段中的位置
選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40位元組
TCP的運輸連接配接有三個階段,即連接配接建立、資料傳送、連接配接釋放。
TCP連接配接建立的過程要使每一方能夠确定對方的存在:主動發起連接配接建立的應用進行叫做客戶(client),被動等待連接配接建立的應用程序叫做伺服器(server),連接配接建立的過程叫做三次握手。
首先要知道這些英文含義:
1.序号:seq序号,占32位,用來辨別從TCP源端向目的端發送的位元組流,發起方發送資料時對此進行标記。表示發送第幾個包。
2.确認序号:ack序号,占32位,隻有ACK标志位為1時,确認序号字段才有效,ack=seq+1。(意思就是,收到你的第seq個包了,下次請發送第ack個包。)
3.标志位:共6個,即URG、ACK、PSH、RST、SYN、FIN。前面已經說過,這裡再說一下大體含義:
URG:緊急指針(urgent pointer)有效。
ACK:确認序号有效。
PSH:接收方應該盡快将這個封包交給應用層。
RST:重置連接配接。
SYN:發起一個新連接配接。
FIN:釋放一個連接配接。
再來看看如何建立連接配接的:
首先Client端發送連接配接請求封包,Server段接受連接配接後回複ACK封包,并為這次連接配接配置設定資源。Client端接收到ACK封包後也向Server段發生ACK封包,并配置設定資源,這樣TCP連接配接就建立了。
1、第一次握手:Client将标志位SYN置為1,随機産生一個值seq=x,并将該資料包發送給Server,Client進入SYN_SENT狀态,等待Server确認。
2、第二次握手:Server收到資料包後由标志位SYN=1知道Client請求建立連接配接,Server将标志位SYN和ACK都置為1,ack=x+1,随機産生一個值seq=y,并将該資料包發送給Client以确認連接配接請求,Server進入SYN_RCVD狀态。
3、第三次握手:Client收到确認後,檢查ack是否為x+1,ACK是否為1,如果正确則将标志位ACK置為1,ack=y+1,并将該資料包發送給Server,Server檢查ack是否為y+1,ACK是否為1,如果正确則連接配接建立成功,Client和Server進入ESTABLISHED狀态,完成三次握手,随後Client與Server之間可以開始傳輸資料了。
連接配接的釋放需要發送四個包,是以成為“四次揮手”,四次揮手斷開連接配接。用戶端或伺服器都可以主動發起揮手動作。
由于TCP連接配接時全雙工的,是以,每個方向都必須要單獨進行關閉,這好比,我們打電話(全雙工),正常的情況下(出于禮貌),通話的雙方都要說再見後才能挂電話,保證通信雙方都把話說完了才挂電話。
這一原則是當一方完成資料發送任務後,發送一個FIN來終止這一方向的連接配接,收到一個FIN隻是意味着這一方向上沒有資料流動了,即不會再收到資料了,但是在這個TCP連接配接上仍然能夠發送資料,直到這一方向也發送了FIN。首先進行關閉的一方将執行主動關閉,而另一方則執行被動關閉。
1、第一次揮手:Client發送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀态。
2、第二次揮手:Server收到FIN後,發送一個ACK給Client,确認序号為收到序号+1(與SYN相同,一個FIN占用一個序号),Server進入CLOSE_WAIT狀态。
3、第三次揮手:Server發送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀态。
4、第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀态,接着發送一個ACK給Server,确認序号為收到序号+1,Server進入CLOSED狀态,完成四次揮手。
有限狀态機FSM:FiniteState Machine
CLOSED 沒有任何連接配接狀态
LISTEN 偵聽狀态,等待來自遠方TCP端口的連接配接請求
SYN-SENT 在發送連接配接請求後,等待對方确認
SYN-RECEIVED 在收到和發送一個連接配接請求後,等待對方确認
ESTABLISHED 代表傳輸連接配接建立,雙方進入資料傳送狀态
FIN-WAIT-1 主動關閉,主機已發送關閉連接配接請求,等待對方确認
FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接配接确認,等待對方發送關閉傳輸連接配接請求
TIME-WAIT 完成雙向傳輸連接配接關閉,等待所有分組消失
CLOSE-WAIT 被動關閉,收到對方發來的關閉連接配接請求,并已确認
LAST-ACK 被動關閉,等待最後一個關閉傳輸連接配接确認,并等待所有分組消失
CLOSING 雙方同時嘗試關閉傳輸連接配接,等待對方确認
客戶機端的三次握手和四次揮手:
伺服器端的三次握手和四次揮手:
為什麼建立連接配接協定是三次握手,而關閉連接配接卻是四次握手呢?
這是因為服務端在LISTEN狀态下,收到建立連接配接請求的SYN封包後,把ACK和SYN放在一個封包裡發送給用戶端。而關閉連接配接時,當收到對方的FIN封包時,僅僅表示對方不再發送資料了但是還能接收資料,己方也未必全部資料都發送給對方了,是以己方可以立即close,也可以發送一些資料給對方後,再發送FIN封包給對方來表示同意現在關閉連接配接,是以,己方ACK和FIN一般都會分開發送。
為什麼 TIME_WAIT狀态還需要等 2MS L後才能傳回到 CLOSED 狀态?
這是因為雖然雙方都同意關閉連接配接了,而且握手的4個封包也都協調和發送完畢,按理可以直接回到 CLOSED 狀态(就好比從 SYN_SEND 狀态到 ESTABLISH 狀态那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最後發送的 ACK 封包會一定被對方收到,是以對方處于 LAST_ACK 狀态下的 SOCKET 可能會因為逾時未收到 ACK 封包,而重發 FIN 封包,是以這個 TIME_WAIT 狀态的作用就是用來重發可能丢失的 ACK 封包。
(注:部分内容來源于網絡)