Linux下的socket編程實踐(一)網路基本知識以及TCP/IP簡述
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包響應包。