Linux網路程式設計1

mf1crystal發表於2017-12-10

TCP、IP理論基礎
協議棧
Linux的優點之一就是在於它豐富而穩定的網路協議棧,其範圍是從協議無關層(如通用的socket層介面和裝置層)到各種網路協議的實現;
對於網路理論介紹一般採用OSI模型,但是Linux中網路棧的介紹一般分為四層的Internet模型

TCP/IP協議族
TCP/IP 實際上一個協同工作的通訊家族,為網路資料通訊提供通路。為討論方便可TCP/IP 協議組大體上分為三部分:
1、Internet 協議(IP)
2、傳輸控制協議(TCP)和使用者資料包協議(UDP)
3、處於 TCP 和 UDP 之上的一組應用協議。它們包括:TELNET,檔案傳送協議(FTP),域名服務(DNS)和簡單的郵件傳送程式(SMTP)等

網路層
第一部分稱為網路層。主要包括Internet 協議(IP)、網際控制報文協議(ICMP)和地址解析協議(ARP)
Internet 協議(IP)
該協議被設計成互聯分組交換通訊網,以形成一個網際通訊環境。它負責在源主機和目的地主機之間傳輸來自其較高層軟體的稱為資料包文的資料塊,它在源和目的地之間提供非連線型傳遞服務
網際控制報文協議(ICMP)
它實際上不是IP層部分,但直接同IP層一起工作,報告網路上的某些出錯情況。允許網際路由器傳輸差錯資訊或測試報文。
地址解析協議(ARP)
ARP 實際上不是網路層部分,它處於IP和資料鏈路層之間,它是在32位IP地址和48位實體地址之間執行翻譯的協議

傳輸層協議
第二部分是傳輸層協議,包括傳輸控制協議和使用者資料包文協議
傳輸控制協議(TCP):
該協議對建立網路上使用者程式之間的對話負責,它確保程式之間的可靠通訊,所提供的功能如下:
1.監聽輸入對話建立請求
2.請求另一網路站點對話
3.可靠的傳送和接收資料
4.適度的關閉
使用者資料包文協議(UDP):
UDP 提供不可靠的非連線型傳輸層服務,它允許在源和目的地之間傳送資料,而不必在傳送資料之前建立對話。它主要用於那些非連線型的應用程式,如:視訊點播

應用協議層
這部分主要包括Telnet,檔案傳送協議(FTP 和TFTP),簡單檔案傳送協議(SMTP)和域名服務(DNS)等協議

IP協議
IP主要有以下四個主要功能:
資料傳送
定址
路由選擇
資料包文的分段
IP的主要目的是為資料輸入/輸出網路提供基本演算法,為高層協議提供無連線的傳送服務.這意味著在IP將資料遞交給接收站點以前不在傳輸站點和接收站點之間建立對話。它只是封裝和傳遞資料,但不向傳送者或接收者報告包的狀態,不處理所遇到的故障

TCP協議
TCP是重要的傳輸層協議,目的是允許資料同網路上的其他節點進行可靠的交換。它能提供埠編號的譯碼,以識別主機的應用程式,而且完成資料的可靠傳輸TCP 協議具有嚴格的內裝差錯檢驗演算法確保資料的完整性TCP 是面向位元組的順序協議,這意味著包內的每個位元組被分配一個順序編號,並分配給每包一個順序編號

UDP
UDP也是傳輸層協議,它是無連線的,不可靠的傳輸服務.當接收資料時它不向傳送方提供確認資訊,它不提供輸入包的順序,如果出現丟失包或重份包的情況,也不會向傳送方發出差錯報文.由於它執行功能時具有較低的開銷,因而執行速度比TCP快

socket
Linux中的網路程式設計通過Socket(套接字)介面實現,Socket是一種檔案描述符
套接字socket有三種型別:
流式套接字(SOCK_STREAM)
流式的套接字可以提供可靠的、面向連 接的通訊流。它使用了TCP協議。TCP保證了資料傳輸的正確性和順序性
資料包套接字(SOCK_DGRAM)
資料包套接字定義了一種無連線的服務,資料通過相互獨立的報文進行傳輸,是無序的,並且不
保證可靠,無差錯,它使用資料包協議UDP。
原始套接字
原始套接字允許對低層協議如IP或ICMP直接訪
問,主要用於新的網路協議的測試等
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
Sa_family:
地址族,採用“AF_xxx”的形式,如:AF_INET
Sa_data:
14位元組的特定協議地址
struct sockaddr_in
{
short int sin_family; /* Internet地址族 */
unsigned short int sin_port; /* 埠號 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填0 */
};
程式設計中一般並不直接針對sockaddr資料結構操作,而是使用與sockaddr等價的sockaddr_in資料結構
struct in_addr
{
unsigned long s_addr;
}
S_addr: 32位的地址

相關文章