日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unix网络编程——网络基础

發布時間:2024/8/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unix网络编程——网络基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、傳輸控制協議(TCP)

tcp是面向連接的的,他不可以被描述為100%可靠的協議,他提供的是數據的可靠傳遞故障的可通知。它保證了數據的可以順序到達、不重復、不丟包。tcp重要的是三次握手和四次揮手做了什么,每次響應和發送都代表了什么?;镜腡CP編程模板如下圖:

?

1.1 三次握手階段

SYN:表同步。

服務器端:執行socket創建監聽套接字,使用bind函數來綁定存有端口與IP地址的結構體到socket,執行listen函數使服務端主動連接的socket轉化為被動的socket,使這個socket可以等待其他socket的連接請求,再利用accpt函數從連接隊列中取出連接請求,這里并不是建立了連接,如果連接隊列為空的話服務端進入睡眠,如果執行成功的話返回一個非零的描述符用作后續信息傳輸的端口(已連接套接字)

客戶端:執行socket創建套接字,使用connect函數連接服務端,這里是主動打開。

三次握手的過程:

1、服務器執行了accpt后進入等待客戶端接入的狀態,此時是被動打開,而客戶端調用connect后主動連接服務器,執行connect后進入阻塞狀態(SYN_SENT),并且發送SYN包。

2、服務端收到客戶端發送的SYN包后進入SYN_RECV狀態并且回應客戶端的SYN包,回應的是一個ACK包,他就是客戶端SYN包加一,且發送一個自己的SYN包。

3、客戶端接受到服務器的響應和服務器發送的SYN包進入數據傳輸狀態(ESTABLISH),發送ACK響應包,內容就是服務器發送的SYN包加一。

4、服務器再接收到這個ACK包后也進入數據傳輸狀態(ESTABLISH)。此時accpt返回一個已連接套接字,就可以開始通訊了。

1.2 數據傳輸階段

1.客戶端使用write來進行數據請求。

2.服務器使用read得到客戶端的請求,再使用write返回客戶端需要的數據請求ACK包。

3.客戶端使用read讀取服務端返回的數據并且給服務器發送一個應答ACK包。

注意點:有序列號所以不會重復發送,也不會亂序,更不會導致漏發。

有流量控制,TCP總是告知對端他能夠接受到多少字節的數據,不會導致接受緩沖區溢出。

1.3 四次揮手階段

1.客戶端調用close函數主動關閉,進入FIN_WAIT_1階段并發送FIN包。

2.服務端接受FIN包后進入CLOSE_WAIT狀態,并返回一個ACK包(FIN+1)。

3.客戶端接受到ACK包后進入FIN_WAIT_2狀態。

4.服務端調用close函數進入LAST_ACK狀態并發送一個FIN包。

5.客戶端接收到FIN包后進入TIME_WAIT狀態,并返回ACK包。

6.服務端接收到ACK后進入CLOSED狀態,關閉連接。

整個過程如下圖所示:

二、TIME_WAIT狀態

TIME_WAIT狀態是客戶端發送ACK包后的狀態,此時他不會直接關閉,因為他發送的ACK包有可能在傳輸的過程中丟掉了,并不會被服務端所接受到,服務端有可能重新發送FIN包,如果客戶端直接關閉會導致服務端一直反復發送FIN包等待結束。所以需要有TIME_WAIT這一狀態,這個狀態持續的時間為2MSL(MSL:任何IP包在intel網中存活的最長時間)。

所以TIME_WAIT的存在可以使TCP執行完整的關閉允許老的重復的分節在網絡中消逝

三、常用結構體

struct sockaddr{unsigned short sa_family;//地址類型AF_xxxxchar sa_data[14];//14字節,2字節端口號,剩余放IP }; struct sockaddr_in{short int sin_family;//地址類型AF_xxxxunsigned short int sin_port;//2字節端口號struct in_addr sin_addr;//存IP地址的結構體unsigned char sin_zero[8];//占位,保持與sockaddr結構體占一樣內存大小 }; struct in_addr{unsigned long s_addr;//4字節存放IP地址 };

sockaddr_in比sockaddr結構體好就好在IP和端口分開存儲。?

四、recv與send的本質

應用層函數recv、send與內核中套接字的真正讀取數據,TCP協議層是運行在內核中的,二通信是網卡直接通訊,只要對方send,線路上就有數據,那么協議就會從網卡讀取數據進入內核的socket緩沖區中,recv只是從socket內核中把數據拷貝到指定的緩沖區buf中,對協議毫無影響。

socket默認是全緩沖,如果沒有setsocketopt的話,只有當socket內核緩沖區中的數據滿了才會發送,通過網卡發送。send其實就是將應用層數據拷貝到socket的緩沖區而已,并不代表真正的數據發送。

五、主機與網絡字節序(大小端問題)

主機字節序:小端存儲,數據的高位存放在終止地址,數據的低位存放在起始地址。

網絡字節序:大端存儲,數據的高位存放在起始地址,數據的低位存放在終止地址。

在網絡的傳輸中需要利用兩種字節序的轉換函數來進行轉換,這些函數可以自己找找看。我們也可以寫個函數來判斷系統是大端還是小端,代碼如下:

int main(int arv,char** argv) {union{short s;char c[sizeof(short)]}un;un.s=0x0102;printf("%s:",CPU_OS);if(sizeof(short)==2){if(un.c[0]==1&&un.c[1]==2){printf("big-endian\n");}else printf("little-endian\n");} exit(0); }

?

總結

以上是生活随笔為你收集整理的unix网络编程——网络基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。