網路程式設計(二)

2021-08-10 12:16:09 字數 3125 閱讀 5925

一、流式服務和資料報服務

1、位元組流服務:傳送端send()只是將資料寫到tcp傳送緩衝區中,然後將傳送緩衝區中的資料打包成報文段傳送出去。接收端又將接收到的報文段寫到緩衝區中,最後recv()直接取資料。

位元組流服務特點:資料沒有明確分割(由底層做分割),不分一定的報文段,什麼時候想發便可將寫入緩衝區的資料,進行打包再傳送,即send()與recv()的次數不完全對等,沒有必然聯絡。

2、資料報服務:傳送端sendto()將資料直接打包成相對應的報文段傳送。

資料報服務特點:資料有明確分割,拿資料按報文段拿。發幾次接收端收幾次。

上一節《tcp》中介紹了tcp報頭,再來看一下udp報頭。

源埠號和目的埠號是必須要有的,接下來是16位資料報長度,指udp報頭和資料總長度。這一點和tcp是不同的。16位校驗和檢驗udp報頭和資料的準確性,和tcp不同的是,udp報頭中校驗和不是必須有的。

二、udp程式設計步驟:

伺服器:

1、socket

2、bind

3、recvfrom/sendto

4、close

客戶端:

1、socket

2、sendto/recvfrom

3、close

//客戶端

void main()

; recvfrom(sockfd,buff,127,0,null,null);

printf("recv::%s\n",buff);

close(sockfd);

}//伺服器

void main()

; int len_cli = sizeof(cli);

recvfrom(sockfd,buff,127,0,(struct sockaddr*)&cli,&len_cli);

printf("ip:%s\n,d:%d\n,recv::%s\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port),buff);

sendto(sockfd,"ok",strlen("ok"),0,(struct sockaddr*)&cli,len_cli);

}close(sockfd);

}

結果如下:

再詳細介紹一下和tcp不同的兩個函式:

ssize_t  recvfrom( int sockfd, //通過哪個socket進行通訊

void *buf, //緩衝區

size_t len, //緩衝區大小

int flags,//暫時設0

struct sockaddr *src_addr, //把資料傳送給誰

socklen_t *addrlen );//位址結構體長度

ssize_t sendto( int sockfd,

const void *buf, 

size_t len, 

int flags,

const struct sockaddr *dest_addr, 

socklen_t addrlen );

三、ip

介紹完傳輸層的兩個協議,看看網路層的ip協議。ip協議為上層提供無狀態、無連線、不可靠的服務。

無狀態指ip通訊雙方不同步傳輸資料的狀態資訊,因此所有ip資料報的傳送、傳輸和接收都是獨相互立的、沒有上下文關係的。最大的缺點就是無法處理亂序和重複的ip資料報。面向連線的協議,如tcp能夠自己處理亂序的、重複的報文段,它交給上層的一定是有序的、正確的。無狀態服務的優點也很明顯:簡單、高效。udp協議和http協議都是無狀態協議。

其ipv4頭部結構如下:

4為版本號:指定ip協議的版本,對ipv4來說是4.

4位頭部長度:標識ip頭部有多少個32位,這一點和tcp是一樣的,最長60位元組。

8位服務型別:包括乙個3位的優先權字段(現已被忽略)、4位的tos欄位和一位保留字段(必須置0)。4位tos欄位分別表示:最小延時(例如直播)、最大吞吐量(例如ftp)、最高可靠性(例如銀行系統)、最小費用(省流量)。這4位最多乙個置1,也就是說是互斥的。

16位總長度:指整個ip資料報的長度(位元組)。

16位標識:唯一地標識主機傳送的每乙個資料報。其初始值由系統隨機生成:每發乙個資料報,其值加1。tcp中的32位序號也是初始值隨機生成,隨後其值加1,但是tcp中的序號是排序用的,而ip中的16位標識是分片用的,同乙個資料報中的所有分片都具有相同的識別符號。

3位標誌:第一位保留置0。

第二位表示「

禁止分片

」。第三位表示「更多分片」,除最後乙個分片外,其它都置1。

13位片偏移:分片相對原始ip資料報開始處(僅指資料部分)的偏移。實際的偏移值左移3位(乘8)得到。

8位生存時間(ttl):資料報到達目的地之前允許經過的路由器跳數。ttl被傳送端設定(常見64),**過程中每經過乙個路由器其值減1。當ttl值減為0時,路由器將丟棄該資料報,並向源端傳送乙個icmp差錯報文。該值可防止資料報陷入路由迴圈。

8位協議:區分上層協議。icmp是1,tcp是6,udp是17。

16位頭部校驗和:由傳送端填充,僅檢驗ip資料報頭部。(ip資料報頭部沒錯就可以正確**,不檢驗資料,不可靠。)

32位源端ip位址和

目的端ip位址:標識資料報的傳送端和接收端。

再詳細說一下ip分片。當ip資料報的長度超過幀的mtu(網路最大傳輸單元)時,它將被分片傳輸。分片可能發生在傳送端也可能發生在中轉路由上,但是只有在最終的目標機器上才會被核心的ip模組重新組裝。ip資料報頭部的三個欄位給分片提供了足夠的資訊:資料報標識,標誌,片偏移。下面是乙個分片示意圖

網路程式設計(二)

網路程式設計基礎 二 struct in addr 這個結構體中儲存的是網路二進位制的ip位址 include struct hostent gethostbyname const char name name 網域名稱 返回值 struct hostent define h addr h addr...

網路程式設計(二)

在之前的部落格中,介紹了傳輸層的一種重要協議 tcp協議。今天來介紹另外一種傳輸層協議 udp 一 udp udp 無連線的 不可靠的 資料報服務。首先看一下udp報頭 從上圖可以看出,udp協議報頭比tcp協議報頭簡單很多,沒有tcp報頭裡面那麼多的保證機制,所以udp較比tcp簡單。不可靠 ud...

網路程式設計(二)

1.掌握伺服器怎麼列印誰來連線的我 connect fd accept sock fd,null,null 阻塞,等待客戶端連線 accept函式 引數1 監聽套接字 2.掌握tcp客戶端怎麼寫的,流程 3.熟悉netstat antp命令 該命令可以檢視所有tcp連線狀態 4.套接字有傳送緩衝區和...