Linux C高级编程——网络编程之UDP(4)
Linux網絡編程——UDP
宗旨:技術的學習是有限的,分享的精神是無限的。
下面分析一幀基于UDP的TFTP協議幀。
以太網首部
0000:?00?05?5d?67?d0?b1?00?05?5d?61?58?a8?08?00
IP首部0000:?45?00
0010:?00?53?93?25?00?00?80?11?25?ec?c0?a8?00?37?c0?a8
0020:?00?01
UDP首部
0020:?05?d4?00?45?00?3f?ac?40
TFTP協議
0020:?00?01?'c'':''\''q'
0030:?'w''e''r''q''.''q''w''e'00?'n''e''t''a''s''c''i'
0040:?'i'00?'b''l''k''s''i''z''e'00?'5''1''2'00?'t''i'
0050:?'m''e''o''u''t'00?'1''0'00?'t''s''i''z''e'00?'0'
0060:?00
以太網首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上層協議類型0x0800表示IP。
IP首部:每一個字節0x45包含4位版本號和4位首部長度,版本號為4,即IPv4,首部長度為5,說明IP首部不帶有選項字段。服務類型為0,沒有使用服務。?16位總長度字段(包括IP首部和IP層payload的長度)為0x0053,即83字節,加上以太網首部14字節可知整個幀長度是97字節。?IP報標識是0x9325,標志字段和片偏移字段設置為0x0000,就是DF=0允許分片,?MF=0此數據報沒有更多分片,沒有分片偏移。?TTL是0x80,也就是128。上層協議0x11表示UDP協議。?IP首部校驗和為0x25ec,源主機IP是c0?a8?00?37(?192.168.0.55),目的主機IP是c0?a8?0001(?192.168.0.1)。
UDP首部:源端口號0x05d4(?1492)是客戶端的端口號,目的端口號0x0045(?69)是TFTP服務的well-known端口號。?UDP報長度為0x003f,即63字節,包括UDP首部和UDP層payload的長度。?UDP首部和UDP層payload的校驗和為0xac40。
TFTP是基于文本的協議,各字段之間用字節0分隔,開頭的00?01表示請求讀取一個文件,接下來的各字段是:
c:\qwerq.qwe
netascii
blksize?512
timeout?10
tsize?0
? ? ? ? 一般的網絡通信都是像TFTP協議這樣,通信的雙方分別是客戶端和服務器,客戶端主動發起請求(上面的例子就是客戶端發起的請求幀),而服務器被動地等待、接收和應答請求??蛻舳说?span style="font-family:Times New Roman">IP地址和端口號唯一標識了該主機上的TFTP客戶端進程,服務器的IP地址和端口號唯一標識了該主機上的TFTP服務進程,由于客戶端是主動發起請求的一方,它必須知道服務器的IP地址和TFTP服務進程的端口號,所以,一些常見的網絡協議有默認的服務器端口,例如HTTP服務默認TCP協議的80端口,?FTP服務默認TCP協議的21端口,?TFTP服務默認UDP協議的69端口(如上例所示)。在使用客戶端程序時,必須指定服務器的主機名或IP地址,如果不明確指定端口號則采用默認端口,請讀者查閱ftp、?tftp等程序的man?page了解如何指定端口號。?/etc/services中列出了所有wellknown的服務端口和對應的傳輸層協議,這是由IANA(?Internet?Assigned?Numbers?Authority)規定的,其中有些服務既可以用TCP也可以用UDP,為了清晰,?IANA規定這樣的服務采用相同的TCP或UDP默認端口號,而另外一些TCP和UDP的相同端口號卻對應不同的服務。
? ? ? ? UDP協議不面向連接,也不保證傳輸的可靠性,例如:
? ? ? ? 發送端的UDP協議層只管把應用層傳來的數據封裝成段交給IP協議層就算完成任務了,如果因為網絡故障該段無法發到對方,UDP協議層也不會給應用層返回任何錯誤信息。
? ? ? ? 接收端的UDP協議層只管把收到的數據根據端口號交給相應的應用程序就算完成任務了,如果發送端發來多個數據包并且在網絡上經過不同的路由,到達接收端時順序已經錯亂了,UDP協議層也不保證按發送時的順序交給應用層。
? ? ? ? 通常接收端的UDP協議層將收到的數據放在一個固定大小的緩沖區中等待應用程序來提取和處理,如果應用程序提取和處理的速度很慢,而發送端發送的速度很快,就會丟失數據包,?UDP協議層并不報告這種錯誤。
總結
以上是生活随笔為你收集整理的Linux C高级编程——网络编程之UDP(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2015卸载官方教程
- 下一篇: Linux C高级编程——文件操作之系统