歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux下的socket編程實踐(一)網絡基本知識以及TCP/IP簡述

Linux下的socket編程實踐(一)網絡基本知識以及TCP/IP簡述

日期:2017/3/1 12:24:06   编辑:關於Linux

ISO/OSI七層參考模型

\

1.物理層:主要定義物理設備標准,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地後再轉化為1、0,也就是我們常說的數模轉換與模數轉換)。這一層的數據叫做比特。(標志:RJ-45) 2.數據鏈路層:定義了如何讓格式化數據以進行傳輸,以及如何讓控制對物理介質的訪問。這一層通常還提供錯誤檢測和糾正,以確保數據的可靠傳輸,交換機屬於本層。 3.網絡層:在位於不同地理位置的網絡中的兩個主機系統之間提供連接和路徑選擇。Internet的發展使得從世界各站點訪問信息的用戶數大大增加,而網絡層正是管理這種連接的層。(標志:路由選擇,IP/OSPF,ICMP,IGMP) 4.傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。 主要是將從下層接收的數據進行分段和傳輸,到達目的地址後再進行重組。常常把這一層數據叫做段。 5.會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數據傳輸的通路。主要在你的系統之間發起會話或者接受會話請求(設備之間需要互相認識可以是IP也可以是MAC或者是主機名)。 6.表示層:可確保一個系統的應用層所發送的信息可以被另一個系統的應用層讀取。例如,PC程序與另一台計算機進行通信,其中一台計算機使用擴展二一十進制交換嗎(EBCDIC),而另一台則使用美國信息交換標准碼(ASCII)來表示相同的字符。如有必要,表示層會通過使用一種通格式來實現多種數據格式之間的轉換。 7.應用層:是最靠近用戶的OSI層。這一層為用戶的應用程序(例如電子郵件、文件傳輸和終端仿真)提供網絡服務。 (標志:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3)

TCP/IP四層模型

ISO制定的OSI參考模型的過於龐大、復雜招致了許多批評。與此對照,由技術人員自己開發的TCP/IP協議棧獲得了更為廣泛的應用。

\

應用層: FTP,TELNET為了完成一定的用戶需求,自定義協議,QQ協議

傳輸層:TCP UDP

網絡層: ICMP,IP,IGMP

數據鏈路層: ARP,RARP硬件接口

運行FTP協議的兩台主機:

\

每個層次具有自己的協議,每層之間進行通信;他們的語言一致,我們可以看作是A進程和B進程之間進行對等通信,也就是虛電路(並不是真正的建立連接線)對等數據傳輸的是邏輯流,例如現在有兩個人通過手機進行通信,好像就在耳邊,其實是通過電磁波。

封裝:

\

分用

\

端口:

端口由IANA分配和控制他們緊密綁定一些服務:0~1023
注冊端口:1024~49151,在這之間端口松散的綁定一些服務
動態或者私有(臨時)端口 49152~65535(實際上從1024)開始分配
鏈路層:

以太網的幀格式

\

鏈路層的數據包,稱為以太網幀; 鏈路層不識別IP地址[因為IP地址是邏輯地址],鏈路層識別物理網卡MAC地址[硬件地址]; 需要根據IP地址(邏輯地址)找到對方的MAC地址(ARP地址解析協議)[MAC —> IP地址方向地址解析];MAC->IP 反向地址解析(RARP協議); 類型(2字節)用來區分IP,ARP,RARP。

//以太網首部代碼  
struct ethernet_hdr  
{  
    char dest_mac[6];  
    char src_mac[6];  
    short protocol;  
};  

MTU/路徑MTU

鏈路層具有最大傳輸單元MTU這個特性,它限制了數據幀的最大長度,不同的網絡類型都有一個上限值。以太網的MTU是1500,你可以用 netstat -i 命令查看這個值。如果IP層有數據包要傳,而且數據包的長度超過了MTU,那麼IP層就要對數據包進行分片(fragmentation)操作,使每一片的長度都小於或等於MTU。另外,多個網絡的鏈路層可能有不同的MTU,選擇通信路徑中較小的MTU,稱作路徑MTU;但是分片會降低網絡的通信效率,應該盡量避免。

ARP地址解析協議

\

本地ARP高速緩存

\

//ARP首部代碼  
struct arp_hdr  
{  
    unsigned short hwtype;  // 固定1  
    unsigned short protype; // 固定0x0800(代表為IP協議做請求)  
    unsigned char hwaddrlen;    // 固定6(即MAC地址長度)  
    unsigned char proaddrlen;   // 固定4 (即IP地址長度)  
    unsigned short opcode;  // Request - 1, Reply - 0x0002  
    unsigned char sender_mac[6];    // 發送者MAC  
    unsigned char sender_ip[4]; // 發送者IP  
    unsigned char dest_mac[6];  // 接收者MAC  
    unsigned char dest_ip[4];   // 接收者IP  
};  

源端和目的端都將加入ARP緩沖區。

RARP反向地址解析協議,適用於無盤工作站,IP一般存於配置文件中

這個時候要想獲取IP地址,就通過RARP協議,通過向RARP服務器發送請求

網絡層:

IP數據報

\

首部最大長度是15*4=60個字節,15最為單位,選項最多有40個字節。

協議類型8位 判斷高層是TCP還是UDP,頭部校驗和校驗IP頭部的完整性,並不校驗數據的完整性。

服務類型:

\

IP數據報最大可達65535;分片共享一個標識號

\

\

\

網際校驗和算法: http://blog.csdn.net/zhq651/article/details/8515575

//IP首部代碼  
struct ip_hdr  
{  
    char  ver_hl;  
    char  tos;  
    unsigned short len;  
    unsigned short id;  
    unsigned short fragment;  
    char ttl;  
    char protocol;  
    unsigned short hdr_chksum;  
    char src_ip [4];  
    char dest_ip [4];  
};  
路由過程:

\

順序:搜索匹配的主機地址

搜索網絡地址

搜索默認表項

ICMP協議

ICMP協議用於傳遞差錯信息、時間、回顯、網絡信息等控制數據,工作於網絡層(IP),Ping程序使用ICMP協議實現。

\

\

//ICMP首部代碼  
struct icmp_hdr  
{  
    char    type;           // ICMP報文類型  
    char    code;           // “子類型”  
    unsigned short  icmpchksum; // 校驗和  
};  
UDP報文格式

\

//UDP首部代碼  
struct udp_hdr  
{  
    unsigned short src_port;  
    unsigned short dest_port;  
    unsigned short len;  
    unsigned short chksum;  
}; 

TCP報文頭部:

\

連接建立三次握手

\

連接終止四次揮手

\

\

注:慢啟動中的慢 是指基數比較小。

\

步驟a:應用程序ping會判斷發送的是主機名還是IP地址,調用函數gethostbyname()解析主機機B,將主機名轉換成一個32位的IP地址。這個過程叫做DNS域名解析.

步驟b:ping程序向目的IP地址發送一個ICMP的ECHO包

步驟c:將目標主機的IP地址轉換為48位硬件地址,在局域網內發送ARP請求廣播,查找主機B的硬件地址。

步驟d:主機B的ARP協議層接收到主機A的ARP請求後,將本機的硬件地址填充到應答包,發送ARP應答到主機A。

步驟e:發送ICMP數據包到主機B

步驟f:主機B接收到主機A的ICMP包,發送響應包。

步驟g:主機A接收到主機B的ICMP包響應包。

Copyright © Linux教程網 All Rights Reserved