Linux網絡編程

一、TCP/IP理論基礎

1、TCP/IP協議族:TCP/IP爲協議族,有很多子協議,爲一族。
TCP:傳輸控制協議    IP:網絡協議
2、我們所做的爲服務器應用軟件開發,服務器:有相應的硬件,操作系統(電腦也爲服務器,不過多了個顯示)。
3、協議棧:存放很多協議的地方叫做協議棧,其範圍是從協議無關層(如通用的socket層接口與設備層)到各個網絡協議實現

4、傳輸加密過程:


5、Linux加密過程有四層,TCP/IP加密過程有七層,加密過程(TCP/IP):


書P317
6、七層應用層的優缺點
1>七層過於複雜,數據不安全
2>四層數據安全,快速

6、七層應用層的優缺點
1>七層過於複雜,數據不安全
2>四層數據安全,快速

二、相關問題

(一)、IOS七層網絡模型:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層
Linux的TCP/IP四層概念模型:應用層、傳輸層、網際層、網絡接口


一些網絡協議解釋:
1、TFTP:簡單文件傳輸協議
2、FTP:簡單郵件傳輸協議
3、NFS(Network Filesystems):可以通過網絡,讓不同系統分享彼此文件
4、WAIS:
5、Telnet:遠程登錄協議
6、Smtp:簡單郵件傳輸協議
7、Gopher:信息查詢系統協議
8、Rlogin:實現UNIX主機之間遠程登錄
9、DNS(Domain Name System):用於命名組織層次結構中的計算機和網絡服務
10、TCP:傳輸控制協議
11、UDP:數據報協議:提供簡單不可靠的信息傳送服務
12、IP:將數據源送到目的地
13、ICMP:控制報文協議:用於傳輸出錯報告控制信息
14、ARP:地址解析協議,根據IP地址獲取物理地址的一個TCP/IP協議
15、RARP:反向地址轉換協議,將局域網中某個主機物理地址轉化爲IP地址
地址協議主要爲:IP、TCP、與UDP協議,http爲TCP轉化而來


(二)
1、傳輸控制協議TCP(連接可靠):
1>三次握手:1、源主機A的TCP向目標主機B發送連接請求報文段    2、目標主機B的TCP收到連接請求報文段後,如同意發回確認    3、源主機A的TCP收到目標主機B的確認後,給目標主機B給出一個確認
A ---> B
 
//主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;
 
A <--- B
 
//主機B向主機A發送同意連接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)
 
//的數據包:“可以,你什麼時候發?”,這是第二次對話;
 
A ---> B
 
//主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接着吧!”,這是第三次對話。


2、TCP與UDP區別:
1>量:UDP首部簡單,每次傳輸數據量大,實時性好,而TCP首部相對複雜,每次傳輸數據量較小
2>安全:TCP需要三次握手,易受攻擊,安全性較低
3>可靠:TCP通過三次握手建立一個全雙工的連接,比較可靠,而UDP沒有建立一個明確的連接,相對不可靠
4>速度:由於TCP要經歷三次握手並且每次傳播數據量較少,所以傳輸速度相對慢
5>阻塞:tcp要經歷三次握手,相對容易堵塞。


三、五類IP:


四、socket(套接字)

(一)、UNIX網絡便曾通過socket(套接字)接口實現,socket是一個文件描述符
(二)、scoket分爲三類:
1、流式套接字(TCP協議中:SOCK_STREAM)
2、數據報套接字(UDP協議:SOCK_DGRAM)
3、原始套接字:主要用來測試協議
(三)、socket信息數據結構:


struct sockaddr
{
    u_short int sa_family;    //地址族
    char sa_date[14];    //14字節協議地址,即如192.162.1.120
};
//若sa_family置爲AF_XXX形式,用的爲IPV4,其他的爲IPV6
struct sockaddr_in
{
    short int sin_famliy;    //Internet地址族
    unsigned short int sin_port    //端口號
    struct in_addr sin_addr    //    IP地址
    unsigned char sin_zero[0]    //一般置0
};
//IP地址找到服務器,端口號找到服務器上對應的服務器應用軟件。
3、
struct in_addr
{
    long int s_addr;    //32位,這樣IP形式:18-A9-05-2A-8D-FA
};
(四)、地址格式轉換:
用戶在表達地址時採用的是點分十進制表示的數值,而在通常使用的scoket編程中使用的則是32位網絡字節序的二進制值,這就需要將這兩個數值進行轉換
1、inet_aton(const char *cp,struct in_addr *inp);
inet_aton函數用來將參數cp所指的網絡地址字符串轉換成網絡使用的二進制數字,然後存於inp所指的in_addr結構中。in_addr結構爲:
struct in_addr
{
    long int s_addr;    //32位,這樣IP形式:18-A9-05-2A-8D-FA
};
2、inet_ntoa(struct in_addr in);
inet_ntoa用來將參數in所指的網絡二進制的數值轉換爲網絡地址,然後將指向此網絡地址字符串的指針返回
(五)、字節序轉化:
1、網絡傳輸爲大端字節序,計算機爲小端字節序
字節序轉化:
#incude <arpa/inet.h>
uint32_t htonl(uint32 hostlong);
uint16_t htons(uint16 hostshort);
unit32_t ntohs(uint32 hostlong);
unit16_t ntohs(uint16 hostshort);


五、網絡編程

包含頭文件:#include <sys/types.h>    #incldue <sys/socket.h>
1、socket:創建一個套接字
int socket (int domain,int type,int protocol);
domain:指定使用何種地址類型(IPV4,IPV6等)
type:建立何種連接
protocol用來指定socket所使用的傳輸協議編號,通常此參考不用管它,置0;
返回值:成功則返回Socket處理代碼,失敗返回-1
2、bind:用於綁定IP地址與端口號到socket(用於服務器)
int bind(int sockfd,struct *my_addr,int addrlen);
1>sockfd爲socket函數成功的返回值
2>結構體指針指向的結構體:
struct sockaddr
{
    u_short int sa_family;    //地址族
    char sa_date[14];    //14字節協議地址,即如192.162.1.120
};
參數含義爲將該結構體的內容,即IP地址和端口號傳給socked
3>addreln即爲結構體的長度
4>返回值:成功返回0,失敗返回-1,錯誤原因存於errno中。
3、listen:用於等待連線
int listen(int s,int backlog);
1>參數s爲套接字,參數backlog爲設置的最大連接數
2>成功則返回0,失敗返回-1,錯誤原因存於errno。
4、accept:用於接受socket連線
int accept(int s,struct sockaddr *addr,int *addrlen);
accept用來接受參數s的socket連線。參數s的socket的socket必須先經過bind()、listen()函數處理,當有連線進來時accept會返回一個新的socket處理代碼,往後的數據傳送就由新的sockfd處理,而原來的處理代碼可以接受新的連線要求。連線成功時,結構體參數就會被系統填入遠程主機的地址數據,參數addrlen爲結構體的長度。
5、connect:用於建立socket連接
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);
connect用於將參數sockfd的socked連接至參數serv_addr指定的網絡地址
成功返回0,失敗返回-1,錯誤原因存於errno中


6、Linux命令行修改網卡ip:
ifconfig:顯示當前網卡ip
ifconfig eth0 192.168.1.120:修改網卡ip


發佈了47 篇原創文章 · 獲贊 31 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章