TCP/IP協議族簡介
OSI網絡分層介紹
-
OSI的7層網絡結構
-
物理層(Physical Layer):規定了物理線路和設備的觸發、維護、關閉物理設備的機械特性、電氣特性、功能特性和過程,為上層的傳輸提供了一個物理介質。本層是通信端點之間的硬件接口。本層數據傳輸的單位為比特(bit)。實際使用的設備如網卡就屬於這一層。
-
數據鏈路層(Data Link Layer):數據鏈路層在物理介質基礎上提供可靠的數據傳輸,在這一層利用通信信道實現無差錯傳輸,提供物理尋址、數據層幀、數據的檢測重發、流量控制和鏈路控制等功能。數據鏈路層中數據的單位為幀(frame)。
實際中的MAC地址就屬於這一層。MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。
MAC地址通常是一個由12個16進制的數組成,前6位表示網卡的製造產商,後6位表示該產商給產品分配的唯一的序列號。所以每個網卡的MAC地址都應該是唯一的。
MAC地址的工作過程:网络上的数据包从初始点开始 ,经过一个个中间节点最终到达目标节点 ,数据包是如何从初始节点开始识别一个个中间节点最终找到目标节点的呢? 实际上初始节点是根据目标节点的地址 ,将目标节点的IP地址映射到中间节点的MAC地址,找到第一个中间节点。从第一个中间节点出发,根据目标节点的IP地址映射到第二个中间节点的MAC地址,从而找到第二个中间节点……,以此类推,直到当找到最后一个中间节点后,从最后一个中间节点出发,根据目标节点的地址映射到目的节点的MAC地址,从而将数据包传送给目标主机。所以数据包的传送过程就是:不断地将目标节点的地址映射到一个个中间节点的MAC地址,再从一个个中间节点出发,直到找到最终的目标节点 [5] 。
数据包传送的关键是将目标节点的IP地址映射到中间节点的MAC地址。IP地址与MAC地址的映射要通过ARP地址解析协议来完成,它可将网络中的IP地址映射到主机的MAC地址,如交换机可以根据网络中的IP地址来找到本地主机的MAC地址。具体过程是:当交换机接收到来自网上一个数据包时,会根据该数据包的目标IP地址,查看交换机内部是否有跟该IP地址对应的MAC地址 ,如果有上次保留下来的对应的MAC地址,就会将该数据包 转发到对应MAC地址的主机上去。如果在交换机内部没有与目标)地址对应的MAC地址,则交换机会根据ARP协议将目标IP地址按照“表”中的对应关系映射成MAC地址 ,数据包就被转送到对应的MAC地址的主机上 [5] 。
-
網絡層(Network Layer):網絡層負責將各個子網之間的數據進行路由選擇,將數據從一個主機傳送到另一個主機,其功能包括網際互連、流量控制和擁塞控制等。本層的數據單位為包(packet)。本層的定義規範一般為IP。實際中的路由器屬於本層。
-
傳輸層(Transport Layer):傳輸層將上層的數據處理為分段的數據,提供可靠或不可靠的傳輸看,為上層掩蓋下層細節,保證會話層的數據傳送到另一台主機的會話層。傳輸層的數據單位為段(Segment)。本層的定義規範為TCP(可靠)、UDP(不可靠)。
-
會話層(Session Layer):會話層管理主機之間的會話過程,包括會話的建立、終止和會話過程的管理。本層的定義規範為TCP、UDP等。
-
表示層(Presentation Layer):表示層對網絡傳輸的數據進行變換,使得多個主機之間傳送的信息能夠相互理解。包括數據的壓縮、加密、格式的轉換等。本層的定義標準有ASCII、JPEG、MPEG等。
-
應用層(Application Layer):應用層為應用程序提供訪問網絡服務的接口,為用戶提供常用的應用,例如電子郵件程序、網絡瀏覽器等。本層的規範有Telnet、FTP、HTTP、HTTPS、P2P等。
OSI的底三層即物理層、數據鏈路層和網絡層為上面的層提供通信服務。
-
-
OSI模型中的數據傳輸
- 主機A需要發送數據時,數據由應用程序調用應用層接口,進入協議棧的應用層。
- 在應用層,應用層的數據被協議棧加上應用層的報頭,形成應用層協議數據單元,傳遞給表示層。
- 表示層再加上表示層的報頭傳遞給會話層。
- 接下來再會話層、傳輸層、網絡層和數據鏈路層都是加上一個響應層的報頭後向下傳遞。而數據鏈路層還要加上一個尾部,打包成一個數據幀。
- 在物理層,主機A的網絡設備將傳遞過來的數據發送到網絡上。
TCP/IP協議棧
由於OSI參考模型過於龐大、複雜,現在主流的操作系統網絡協議棧基本上都是採用的TCP/IP協議棧。
-
TCP/IP協議棧參考模型
TCP/IP模型分為4個層次:應用層、傳輸層、網絡互聯層和主機到網絡層。
- 主機到網絡層:TCP/IP模型並不具體描述這一層的具體實現,只需要網絡互聯層可以調用這一層的接口以傳輸IP數據包就行了。
- 網絡互聯層:TCP/IP協議棧的核心。負責將數據包分組並發往目的主機或者網絡,為了盡快的發送分組,可能一個數據包的不同分組可能要經過不同的路徑來傳輸。為了在接收端能夠識別這些分組,網絡互聯層定義了數據包的分組格式和協議——IP協議(Internet Protocol),所以這一層又稱為IP層。網絡互聯層的功能有路由、網際互連和擁塞控制等。
- 傳輸層:提供源主機和目標主機上的對等層之間進行會話的機制。這一層定義了兩種協議:傳輸控制協議(transmission control protocol,TCP)和用戶數據報協議(user datagram protocol, UDP)。
- 應用層:TCP/IP中將應用層、表示層和會話層合併為了一個應用層。基於TCP和UDP實現了很多數據傳輸協議。如基於TCP的FTP(File Transfer Protocol)、Telnet協議、HTTP等。基於UDP的有簡化的FTP協議TFTP、網絡管理協議SNMP、域名服務DNS、網絡文件共享NFS和SAMBA等。
-
主機到網絡層協議
本層以以太網為例進行介紹。
以太網數據包的格式如下:
目的地址(6字節) 源地址(6字節) 類型(2字節) 數據(46~1500字節) CRC(4字節) 目的主機的MAC地址 本機的MAC地址 0800表示此幀數據為IP數據,0806表示為ARP數據 對幀內數據進行校驗,以保證正確性。 -
IP協議
IP層的主要目的是提供子網的互聯,形成較大的網絡,是不同子網間能傳輸數據。
如圖是IP頭部的數據格式:
-
版本:標識IPv4和IPv6
-
首部長度:IP字段出去數據的整個頭部的數據長度
-
服務類型:此字段包含3位的優先權,4位的T服務類型和1位的子字段(必須置0)。4位的T服務類型分別表示最小延遲、最大吞吐量、最高可靠性、最小費用。這4位最多只有一個位置置1。全為0表示一般服務。
-
總長度:表示以字節為單位的數據報文長度,長度包含IP的頭部和數據部分的長度。由於本字段的字段為16位,所以IP數據報文最大可達到65535個字節的長度。
-
標識和片偏移:IP每發一份數據報文都會發一個標識來表示此數據包,發送完值會加1。IP進行分片時,將標識複製到每個頭部來表示此報文的來源,還要加上分片數據在原報文的偏移位置。
-
生存時間(TTL)
表示報文最多可以經過的路由器的數量,每經過一個路由器這個值就減一。當路由器發現這個值為0時,就直接將報文丟棄,並發送一個ICMP(Internet Control Message Protocol)報文通知源主機。這是為了防止包在Internet的路由器之間不斷循環。
-
協議類型:表示IP上承載的高級協議,使TCP/IP協議棧在解包後知道把數據發給哪個層的協議進行處理。一般6表示TCP,17表示UDP。
-
校驗和
-
IP選項:識別IP的數據段是正常數據還是用作網絡控制的數據。
-
-
網絡控制報文協議(ICMP)
-
傳輸控制協議(TCP)
-
TCP的特點:
- 字節流服務
- 面向連接的服務:在數據進行傳輸之前,TCP協議要求實現建立連接。
- 可靠傳輸服務:基於校驗和應答重發機制保障傳輸的可靠性。接收方對於接受的報文進行校驗和計算,有誤則重發。發送方等待接收方的確認應答,如果超時也要重發。
- 緩衝傳輸
- 全雙工傳輸:各主機TCP協議允許以全雙工的方式進行數據流交換,即可以一邊發送消息一邊接受消息,互不影響。
- 流量控制:TCP的滑動窗口機制,支持主機間的端到端的流量控制。
-
TCP的數據格式
TCP是被封裝在IP報文的數據部分進行傳輸的。
而TCP報文的數據格式為:
-
源端口和目的端口:這個不用說,每台計算機都有一個16位的端口號,用以標識65535個不同的端口。
-
序列號:表示分配給TCP包的編號,用來標識應用程序從TCP的發送端到接收端發送的字節流。是一個32位的無符號數。
-
確認號:發送方對發送的首字節進行編號,當接收方成功接收後,發送回接收的包的序列號+1,發送方再以這個編號作為新的序列號發送包。
-
頭部長度:最長60個字節,沒有可選字段20個字節。
-
控制位:圖中六個控制位的含義為:
-
窗口尺寸:表示本機上TCP協議可以接收的以字節為單位的數目
-
校驗和:校驗TCP傳輸數據的正誤,TCP的數據傳輸必須強制校驗。
-
-
TCP連接的三次握手(TCP的名場面)
主機A和主機B在建立一個TCP連接時,需要進行三次通信過程(通常稱為"三次握手",three way handshake)
- 主機A發送一個控制位為SYN的消息告訴B想要連接的主機端口以及初始的序列號。
- 主機B應答,回復的SYN段為B的初始序列號,ack段為主機A的發送的序列號加1。
- 主機A將主機B的SYN段加1作為確認好返回給主機B作為應答。
-
TCP釋放連接的四次握手
- 主機A TCP協議棧發送FIN字段,表示釋放連接請求。
- 主機B確認A的FIN請求,確認號是在A的序列號上加1。
- 主機B緊接著發送FIN請求
- 主機A對主機B的FIN請求表示確認。
-
TCP的封裝解封過程
-
-
UDP
UDP協議提供無連接的、不可靠的傳輸服務。
-
UDP的數據格式
UDP的數據格式非常簡單。
-
UDP的封包解包過程
與TCP的非常類似,不細講
-
-
地址解析協議(ARP)
在局域網中必須知道網絡設備的硬件地址才能向目的主機發送數據,但是之前的TCP/IP協議棧都是使用IP地址來表示目的地址。因此必須建議一個IP地址與網絡設備的硬件地址(MAC地址)之間的映射關係,這就是ARP協議。
IP地址時動態的,所以這種映射關係也是動態的,但是每個設備的網卡的地址是固定不變的。
-
ARP過程
我們通過一個ping程序的過程來看一下ARP的過程
-
步驟a:ping程序首先判斷ping的是個主機名還是一個IP地址,如果是一個主機名,首先需要通過DNS域名解析器將主機名轉換為一個32位的IP地址。
-
步驟b:ping程序接著向目的地址發送一個ICMP包。
ICMP(Internet Control Message Protocol):是一個TCP/IP的子協議,用於在IP主機、路由器之間傳遞控制信息。注意是控制信息而不是實際的交換數據。通常指網絡通不通、主機是否可達、路由器是否可達等信息。
-
步驟c:IP地址通過ARP轉換為MAC地址,ARP協議調用後就在局域網內發送請求廣播以查找B的硬件地址。
-
步驟d:B的ARP協議接收到請求後,發送ARP應答給A
-
步驟e:A接收到響應包後發送ICMP數據包到B
-
步驟f:B再發送響應包
-
步驟g:A接收到響應包
在Linux shell上可以通過
arp -v
命令查看本地的ARP高速緩存中的內容。 -
-
IP地址分類與TCP/UDP端口
IP地址由4組十進制數組成,每組數值的範圍是0~255。
-
因特網IP地址的分類
IP地址由類型、網絡ID和主機ID組成。網絡ID標識設備或主機所在的網絡,主機ID標識網絡上IP所屬的工作站、服務器或路由選擇器。
-
IP地址分類
IP地址分為五類,不同類別之間的IP地址依靠分割點的位置來區分。
其中最常見的C類地址只有8位用來標識主機,所以在一個網絡中只能存在254台主機。之所以不是256台是因為有兩個ID不能使用。如0號不分配給主機而是用於表示某個網絡,如192.168.1.0,就表示192.168.1.0這個網絡。255號也不分配,因為這個地址用於廣播。可以將數據發送給本網絡中的所有節點。至於是否能夠廣播,與物理網絡有關。
-
特殊的IP地址
-
主機ID為0和為255的已經講過了。
-
255.255.255.255:這個地址和0.0.0.0可以一起講。每台主機在剛剛啟動時IP地址都是0.0.0.0,可以說這時還沒有分配IP地址,因此主機便向IP為255.255.255.255的IP發送請求。
255.255.255.255的IP代表的是一個DHCP Server(Dynamic Host Configuration Protocol)。DHCP Server就是一種專門用於給未分配IP的主機分配IP的server。DHCP server除了分配一個IP,還分配一個子網掩碼。
DHCP有三種分配方式:自動分配、動態分配、手工分配三種。
-
127.0.0.1:回送地址,常說的"localhost"就是說的這個地址,常用於測試使用。
-
-
-
IP地址的配置
在Linux下通過ifconfig命令來顯示、設置網絡設備的IP地址和子網掩碼。格式為:
if config 網絡編號 IP地址 netmask 子網掩碼
主機字節序和網絡字節序
網絡開發中一個常見的問題是字節序問題,因為網絡通信連接的是不同類型的設備,這就需要保證=同一個數據在不同的設備上具有唯一的含義。因此產生了字節序問題。
-
字節序的含義
字節序的問題是由於CPU對整數在內存中的存放方式造成的。多於一個字節(8 bits)的數據類型在內存中的存放順序稱為主機字節序。常見的有小端字節序和大端字節序。
- 小端字節序(Little Endian):將數據的最低字節放在內存的起始位置。採用小端字節序的CPU有x86架構的Intel系列產品。
- 大端字節序(Big Endian):將數據的高字節放在內存的起始位置。這與思維習慣不一致,但是與實際數據的表達方式一致,因為實際數據表示就是從左到右就是表示從高到低的,而內存從左到右是從低到高的。典型的PowerPC的Unix系統採用此方式。
-
網絡字節序的轉換
由於不同平台採用不同的字節序產生兼容問題。不同平台在傳輸數據時都會先轉化為網絡字節序再進行傳送,到達目的主機後再轉換為主機字節序。而網絡字節序的標準為大端字節序。
Linux下進行字節序轉換的函數有:
應用層服務程序簡介
-
HTTP簡介
HTTP想必很熟悉了,不多介紹
-
FTP協議和服務
FTP用於在客戶端和服務器之間進行文件傳輸。
-
FTP協議的步驟
- 用戶通過FTP端口輸入命令,連接遠程的FTP服務器。輸入用戶名和密碼後便可進入。
- 進入目的目錄,使用FTP協議特定的命令行格式,服務器解析後開始文件的下載。
-
FTP是雙端口服務器
FTP和HTTP一個主要的差別是FTP通過兩個並行的TCP連接來傳送文件,一個是控制連接,一個是數據連接。
-
-
TELNET協議和服務
TELNET是最早出現的遠程登錄協議之一。
-
NFS協議和服務
NFS用於文件共享,客戶端可以像操作本機文件一樣操作遠程主機的文件。同時支持TCP和UDP。