一、流式服務和資料報服務
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.套接字有傳送緩衝區和...