網絡基礎3(IP段格式,UDP數據報格式,TCP數據報格式)

IP段格式

IP數據報的首部長度和數據長度都是可變長的,但總是4字節的整數倍

對于IPv4,4位版本字段是4。4位首部長度的數值是以4字節為單位的,最小值為5,也就是說首部長度最小是4x5=20字節,也就是不帶任何選項的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60字節。

8位TOS字段有3個位用來指定IP數據報的優先級(目前已經廢棄不用),還有4個位表示可選的服務類型(最小延遲、最大?吐量、最大可靠性、最小成本),還有一個位總是0。總長度是整個數據報(包括IP首部和IP層payload)的字節數。每傳一個IP數據報,16位的標識加1,可用于分片和重新組裝數據報。

3位標志和13位片偏移用于分片。TTL(Time to live)是這樣用的:源主機為數據包設定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0就表示路由已經太長了仍然找不到目的主機的網絡,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協議字段指示上層協議是TCP、UDP、ICMP還是IGMP。然后是校驗和,只校驗IP首部,數據的校驗由更高層協議負責。IPv4的IP地址長度為32位。

想一想,前面講了以太網幀中的最小數據長度為46字節,不足46字節的要用填充字節補上,那么如何界定這46字節里前多少個字節是IP、ARP或RARP數據報而后面是填充字節?

UDP數據報格式

在這里插入圖片描述 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 00 01(192.168.0.1)。

UDP首部:源端口號0x05d4(1492)是客戶端的端口號,目的端口號0x0045(69)是TFTP服務的well-known端口號。UDP報長度為0x003f,即63字節,包括UDP首部和UDP層pay-load的長度。UDP首部和UDP層payload的校驗和為0xac40。
TFTP是基于文本的協議,各字段之間用字節0分隔,開頭的00 01表示請求讀取一個文件,接下來的各字段是:
c:\qwerq.qwe
netascii
blksize 512
timeout 10
tsize 0

一般的網絡通信都是像TFTP協議這樣,通信的雙方分別是客戶端和服務器,客戶端主動發起請求(上面的例子就是客戶端發起的請求幀),而服務器被動地等待、接收和應答請求。客戶端的IP地址和端口號唯一標識了該主機上的TFTP客戶端進程服務器的IP地址和端口號唯一標識了該主機上的TFTP服務進程,由于客戶端是主動發起請求的一方,它必須知道服務器的IP地址和TFTP服務進程的端口號,所以,一些常見的網絡協議有默認的服務器端口,

例如HTTP服務默認TCP協議的80端口,FTP服務默認TCP協議的21端口,TFTP服務默認UDP協議的69端口(如上例所示)。

在使用客戶端程序時,必須指定服務器的主機名或IP地址,如果不明確指定端口號則采用默認端口,請讀者查閱ftp、tftp等程序的man page了解如何指定端口號。

/etc/services中列出了所有well-known的服務端口和對應的傳輸層協議,

這是由IANA(Internet Assigned Numbers Authority)規定的,**其中有些服務既可以用TCP也可以用UDP,為了清晰,IANA規定這樣的服務采用相同的TCP或UDP默認端口號,**而另外一些TCP和UDP的相同端口號卻對應不同的服務。

很多服務有well-known的端口號,然而客戶端程序的端口號卻不必是well-known的,往往是每次運行客戶端程序時由系統自動分配一個空閑的端口號,用完就釋放掉,稱為ephemeral的端口號,想想這是為什么?

前面提過,UDP協議不面向連接,也不保證傳輸的可靠性,例如:
發送端的UDP協議層只管把應用層傳來的數據封裝成段交給IP協議層就算完成任務了,如果因為網絡故障該段無法發到對方,UDP協議層也不會給應用層返回任何錯誤信息。

接收端的UDP協議層只管把收到的數據根據端口號交給相應的應用程序就算完成任務了,如果發送端發來多個數據包并且在網絡上經過不同的路由,到達接收端時順序已經錯亂了,UDP協議層也不保證按發送時的順序交給應用層。

通常接收端的UDP協議層將收到的數據放在一個固定大小的緩沖區中等待應用程序來提取和處理,如果應用程序提取和處理的速度很慢,而發送端發送的速度很快,就會丟失數據包,UDP協議層并不報告這種錯誤。

因此,使用UDP協議的應用程序必須考慮到這些可能的問題并實現適當的解決方案,例如等待應答、超時重發、為數據包編號、流量控制等。一般使用UDP協議的應用程序實現都比較簡單,只是發送一些對可靠性要求不高的消息,而不發送大量的數據。例如,基于UDP的TFTP協議一般只用于傳送小文件(所以才叫trivial的ftp),而基于TCP的FTP協議適用于 各種文件的傳輸。TCP協議又是如何用面向連接的服務來代替應用程序解決傳輸的可靠性問題呢。

TCP數據報格式

在這里插入圖片描述
與UDP協議一樣也有源端口號和目的端口號,通訊的雙方由IP地址和端口號標識。32位序號、32位確認序號、窗口大小稍后詳細解釋。4位首部長度和IP協議頭類似,表示TCP協議頭的長度,以4字節為單位,因此TCP協議頭最長可以是4x15=60字節,如果沒有選項字段,TCP協議頭最短20字節。URG、ACK、PSH、RST、SYN、FIN是六個控制位,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 開發路線

Linux 開發路線: 使用 linux—〉linxu 系統編程開發---〉驅動開發和分析 linux 內核 開始學 linux 內核:最好有三件寶物:《深入理解 linux 內核》《LINUX內核源代碼情景分析》和源代碼。 《深》是綱,《情》是目。最后深入代碼 Linux 內核原理:比較淺顯…

堆的應用(堆排序,TopK問題)

堆的應用 1)排序 堆排序 選擇排序 既可以找到最大的放在最后 也可以找到最小的方最前 但是,堆排序不能找最小的放在最前 因為把最小數放在最前,會破壞掉堆的原來的順序,除非重新建堆 1, 2,9&#xff0c…

有名管道和無名管道的區別

1)無名管道:管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用于父子進程或者兄弟進程之間(具有親緣關系的進程)。 單獨構成一種獨立的文件系統:管道…

網絡基礎4(TCP三次握手,四次握手,TCP流量控制,TCP狀態轉換 , TCP異常斷開,設置TCP屬性,端口復用)

TCP協議 TCP通信時序 下圖是一次TCP通訊的時序圖。TCP連接建立斷開。包含大家熟知的三次握手和四次握手。 TCP通訊時序 在這個例子中,首先客戶端主動發起連接、發送請求,然后服務器端響應請求,然后客戶端主動關閉連接。 兩條豎線表示通訊的…

linux編程手冊讀書筆記第一章(20140329)

(2)管道、FIFO、套接字、設備(比如終端、偽終端)都支持非阻塞模式。(因為無法通過open()來獲取管道和套接字的文件描述符。所以要啟用非阻塞標志,就必須使用fcntl(&#…

排序(基本概念及分類,直接插入排序和希爾排序)

排序的概念 排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。 穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序&a…

Linux編程手冊讀書筆記第二章(20140330)

內核:管理和分配計算機資源(即CPU、RAM和設備)的核心軟件層Linux內核可執行文件采用/boot/vmlinuz或類似的路徑名,“z”表明內核是經過壓縮的可執行文件。內核主要任務: (1&#xff…

直接交換排序

直接交換排序 缺點:進行一些重復性比較,解決放法:堆排序 選擇排序優化 //如果當前的數大于假定最大的數 //改變下標 //如果當前的數小于假定最小的數 //改變下標 //遍歷數組跳到下一個元素 //如果最大的數沒有在它的位置上 //交換 //交換…

Linux編程手冊讀書筆記第三章(20140407)

外殼函數執行一條中斷機器指令(int 0x80),引發處理器從用戶態切換到核心態,并執行系統中斷0x80的中斷矢量所指向的代碼。(在2.6內核及glib 2.3.2之后的版本都支持sysenter指令,進入內核的速度更快&#xff…

Linux編程手冊讀書筆記第四章(20140407)

標準文件描述符定義在<unistd.h>中&#xff0c;STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO打開一個文件&#xff1a;open&#xff08;&#xff09; &#xff03;include<sys/stat.h> #include<fcntl.h> int open(const char *pathname, int flags, …/* …

快速排序概念及實現

快速排序 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法&#xff0c; 其基本思想為&#xff1a; 任取待排序元素序列中的某元素作為基準值&#xff0c;按照該排序碼將待排序集合分割成兩子序列&#xff0c;左子序列中所有元素均小于基準值&#xff0c;右子序列…

Linux編程手冊讀書筆記第五章(20140408)

改變已打開文件性質&#xff1a;fcntl&#xff08;&#xff09; #include<fcntl.h> int fcntl(int fd, int cmd, …); (1) 調用失敗返回&#xff0d;1 &#xff08;2&#xff09;fcntl函數有5種功能&#xff1a; a. 復制一個現有的描述符&#xff08;cmd&#xff1d;F_D…

歸并排序概念及其實現

基本思想&#xff1a; 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個…

##連接符和#符的使用

C語言中如何使用宏C&#xff08;和C&#xff09;中的宏&#xff08;Macro&#xff09;屬于編譯器預處理的范疇&#xff0c;屬于編譯期概念&#xff08;而非運行期概念&#xff09;。下面對常遇到的宏的使用問題做了簡單總結。 關于#和## 在C語言的宏中&#xff0c;#的功能是將其…

計數排序和基數排序

適用于數據集中在某個范圍中&#xff0c; //統計每個數據出現的次數 計數排序&#xff1a;鴿巢原理 1找范圍 2給空間 3記次數 4回收 for(int i 0;i<size; i) {temp[array[i]]; }for(int i0;i<range;i&#xff09;{while(temp[i])array[index]i;}代碼實現 時間復雜度&…

信號量sem_wait()的使用

閑來無事&#xff0c;我給大家講下UNIX/Linux下信號量函數的使用。首先你得知道什么叫信號量&#xff0c;什么時候要用信號量。這個嘛&#xff0c;主要就是用來保護共享資源的&#xff0c;也就是說如果你想限制某個&#xff08;些&#xff09;資源在同一時刻只能有一&#xff0…

C++起始(關鍵字,命名空間,缺省參數,函數重載(c語言為什么不支持函數重載))

1. C關鍵字(C98) 2. 命名空間 在C/C中&#xff0c;變量、函數和后面要學到的類都是大量存在的&#xff0c;這些變量、函數和類的名稱將都存在于全局作用 域中&#xff0c;可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化&#xff0c;以避免命名沖突或名字污…

va_list和vsnprintf、getopt

原理解釋&#xff1a; VA_LIST 是在C語言中解決變參問題的一組宏&#xff0c;在<stdarg.h>頭文件下。 VA_LIST的用法&#xff1a; &#xff08;1&#xff09;首先在函數里定義一具VA_LIST型的變量&#xff0c;這個變量是指向參數的指針 &#xff08;2&a…

GitHub相關

git是一個版本控制工具. 主要解決三個問題 代碼被喵星人吃掉了.產品經理反復修改需求, 需要同時維護多個版本代碼.多人協同開發. 安裝 git for windows 這個是一個git的windows系統的命令行版本 https://git-scm.com/downloads 下載會很慢很慢 使用 Github 創建項目 注冊…

linux中bin與sbin目錄的作用及區別介紹

在linux系統中&#xff0c;有兩個重要的目錄&#xff1a;bin與sbin&#xff0c;分別包括/bin、/usr/bin/與/sbin、/usr/sbin/。 bin: bin為binary的簡寫&#xff0c;主要放置系統的必備執行文件&#xff0c;例如: cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、m…