基於Jpcap的TCP/IP數據包分析
原作:趙新輝
目 錄
第一章 以太網的結構和TCP/IP
1.1 以太網的結構
1.1.1 基於網絡架構的以太網
1.1.2 以太網的數據交換
1.1.3 以太網幀的結構
1.2 IP數據報的構成
1.2.1 IP地址
1.2.2 路由
1.2.3 IP數據報的構成
1.2.4 其他報文結構
1.3 TCP/UDP
1.3.1 TCP/UDP的作用
1.3.2 TCP和UDP報文的結構
第二章 Jpcap類庫
2.1 Jpcap的使用
2.1.1 Jpcap的運行環境的安裝
2.1.2 Jpcap的開發環境的安裝
2.2 Jpcap介紹
2.2.1 Packet基類及其子類
2.2.2 Jpcap的主要功能
第三章 數據包監聽程序的設計
3.1 數據包監聽原理
3.2 以太網幀的解析
3.2.1 獲取MAC地址
3.2.2 數據包類型的判斷
3.3 IP數據報的監聽
3.3.1 IP數據報的解析
3.3.2 ARP和ICMP數據報解析
3.4 TCP和UDP監聽
3.4.1 TCP數據報的解析
3.4.2 UDP數據報的解析
第四章 數據包分析
4.1 流量分析
4.1.1 數據包大小的表示
4.1.2 數據包流量觀測
4.2 數據包分類分析
4.2.1 數據包過濾
4.2.2 利用數據包分析解決網絡問題
第五章 數據包發送
5.1 構造發送IP數據包
5.1.1 IP數據包構造與發送
5.1.2 發送結果分析
5.2 構造發送TCP數據包
5.2.1 TCP數據包構造與發送
5.2.2 發送結果分析
第一章 太網的結構和TCP/IP
1.1 以太網的結構
以太網是當今現有局域網采用的最通用的通信協議標准.該標准定義了在局域網(LAN)中采用的電纜類型和信號處理方法.以太網在互聯設備之間以10~100Mbps的速率傳送信息包,雙絞線電纜10 Base T以太網由於其低成本,高可靠性以及10Mbps的速率而成為應用最為廣泛的以太網技術.許多制造商提供的產品都能采用通用的軟件協議進行通信,開放性最好.以太網,屬網絡低層協議,通常在OSI(open system interconnect reference model)模型的物理層和數據鏈路層操作.它是總線型協議中最常見的,數據速率為10Mbps(兆比特/秒)的同軸電纜系統.
1.1.1 基於網絡架構的以太網
在計算機網絡構成中,一般都實行使用協議進行層與層之間得通信.通常的OSI中,把協議等級分為七層.第一層是物理層,處理關於硬件上的網絡協議.第七層為應用層,處理關於應用程序的協議.第二層到第六層按照其間的順序被依次設置.
層
名 稱
規 定 的 內 容
高層
第七層
應用層
關於郵件,新聞等應用程序的協議
第六層
表示層
數據語法協議
第五層
會話層
基於網絡的管理對話協議
低層
第四層
傳輸層
補充第三層的功能,可靠地在兩台計算機間傳輸數據
第三層
網絡層
從網絡上多台計算機中選擇作為通訊對象地計算機
第二層
數據鏈路層
在兩台計算機上進行一對一數據通信
第一層
物理層
電氣信號,連接器規格等關於硬件地協議
OSI參考模型
以太網是20世紀70年代,施樂(Xerox)公司地Palo Alto研究所設計的,其后在80年代由施樂,英特爾,DEC(后被康柏收購)三家公司總結了面向局域網(LAN)的協議集合.而以太網的規格是由美國電氣和電子工程師協會(Institute of Electrical and Electronics Engineers)中專門討論規格的802委員會,從1980年開始標准化討論的.並把IEEE802.3作為標准規格,其后ISO(International Standard Organization)把它作為ISO802.3標准.
舊的以太網設備是用同軸電纜作為傳送媒體的.使用同軸電纜的以太網,設備之間的連接不需要網絡集線器,但必須在同軸電纜上講設備連接起來,是同軸電纜成為多台設備間共享信號的總線(bus),這種網絡連接形式被稱為總線型.現在,廣為使用的傳送媒體為雙絞線.通常使用的是被稱為第五類的雙絞線,擁有100Mbit/s的通信速度.在用雙絞線連接時要使用被稱為網絡集線器的設備.它是為實現多台計算機的連接,把多根雙絞線相互連接起來的設備.在使用網絡集線器的網絡重,計算機以網絡集線器為中心呈放射狀連接,這樣的網絡被稱為星型網絡.
由於以太網中集線器的轉發功能,也就使得進行數據包監聽可以在局域網內進行.本文中的數據包監聽程序都是在局域網內進行的.當然,數據包監聽也可以在網關等數據包的進出口進行.
1.1.2 以太網的數據交換
在以太網中,數據是以被稱為幀的數據結構體為單位進行交換的.通常在計算機網絡上交換的數據結構體的單位是數據包,而在以太網中把使用的數據包稱為幀.數據包包含着發送給對方所必需信息的報頭部分和記錄着傳送給接收端信息內容的報文部分組成的.報頭包含接收端的地址,發送端的地址,數據錯誤檢查和改正所必需的錯誤檢驗和修正碼.數據包被傳送到網絡上,通過網絡中繼裝置傳送到接收端.
幀是被稱為帶碰撞檢測的載波偵聽多址訪問(CSMA/CD: Carrier Sense Multiple Access with Collision Detection)發送的.在CSMA/CD技術中,如果網絡上沒有數據,則任何時候都可以將數據傳送出去.因此,傳送數據的網絡設備,首先要確認網絡上是否有數據在傳送.如果沒有數據則可以將數據發送到網絡上.如果網絡被使用,那就要等到網絡空閑后發送.上面的工作相當於CSMA/CD的CSMA部分.在這種方法中,同時發送數據的網絡設備會同時認為網絡是空閑的,這樣就會產生發送沖突.因此,在CSMA/CD技術中會經常一邊檢測數據沖突,一邊發送數據.如果檢測出沖突,為強調沖突的發生,要等待發送出32位數據所必需的時間之后,在等待一個隨機決定的時間,而后重新發送.這樣同時開始發送的兩台網絡設備中,隨機數小的網絡設備先進行發送,隨機數大的網絡設備要等到網絡空閑下來才能發送.這種等到時間被稱為補償時間.
網絡擁擠和多次反復發生沖突,就可能造成數據無法發送.因此,為有效利用網絡資源,在網絡空閑和擁擠時,對等待的最大值進行調整.空閑時即沖突次數少的情況下,把等待時間的最大值縮小;擁擠和沖突頻繁發生時,把等待時間的最大值擴大.等待時間的最大值可以用下面的公式表示:
T=Ts×2k
式中Ts為發送512位數據所必需的時間(被稱為Slot時間),k為沖突次數和數字10中最小的數字.
這樣,在CSMA/CD技術中,網絡空間的情況下,任何時候都可以將數據發送出去,萬一發生沖突造成發送失敗時,可以重新發送幀.所以CSMA/CD在網絡比較空閑的情況下是一種高效的通信協議.
但是在網絡擁擠的情況下恰好相反.CSMA/CD發生沖突時,在等待和再次發送等方面花費過多的時間,會造成網絡反復發送無用的數據,網絡設備和傳送線路等網絡資源被白白占用,結果導致通信效率降低.
在沖突頻繁發生的以太網上,CSMA/CD的通信效率非常低,因為無法預測什么時候會發生沖突,因此不能保證對方在一定的限制時間內能接收到數據.這樣,在進行聲音和圖像等對時間依賴性很強的多媒體數據的實時通信的情況下,存在着致命缺陷.所以采用CSMA/CD的以太網不能進行面向多媒體數據的通信.
幀在網絡上傳輸,由網卡接收.一般而言,網卡有幾種接收數據幀的狀態,如unicast,broadcast,multicast,promiscuous等,unicast是指網卡在工作時接收目的地址是本機硬件地址的數據幀.Broadcast是指接收所有類型為廣播報文的數據幀.Multicast是指接收特定的組播報文.Promiscuous則是通常說的混雜模式,是指對報文中的目的硬件地址不加任何檢查,全部接收的工作模式.
當局域網內的主機都通過HUB等方式連接時,一般都稱為共享式的連接,這種共享式的連接有一個很明顯的特點:就是HUB會將接收到的所有數據向HUB上的每個端口轉發,也就是說當主機根據mac地址進行數據包發送時,盡管發送端主機告知了目標主機的地址,但這並不意味着在一個網絡內的其他主機聽不到發送端和接收端之間的通訊,只是在正常狀況下其他主機會忽略這些通訊報文而已!如果這些主機不願意忽略這些報文,網卡被設置為promiscuous狀態的話,那么,對於這台主機的網絡接口而言,任何在這個局域網內傳輸的信息都是可以被偵聽到的.
1.1.3 以太網幀的結構
以太網幀的結構是這樣.開始的64位是前同步碼(preamble)和幀首定界符(start frame delimiter).前同步碼是使發送端和接收端在數據的交接上步調一致的信號.發送端以56位(10101010…10)反復發送1和0信號.接收端接收到這種信號后,准備讀取發送來的信號.
前同步碼結束后使表示幀的真正開始的8位(10101011)位列.幀首定界符之后是地址等報頭信息.幀首定界符后面是接收端及及發送端的MAC地址.只有在接收端的MAC地址是自己的MAC地址的情況下,才能進行幀的接收;MAC地址為其他機器的情況下,將不接收改幀.但當接收端地址全部都為1時,在同一以太網內連接的所有設備,都要接收該幀.地址全部為1的MAC地址稱為廣播地址.
接收端和發送端的MAC地址后面是16位的類型字段(type field).類型字段中存放的是以太網幀中傳送數據的上層協議的種類代碼.以太網幀的報文部最大能存放12000位,即1500字節.以太網是物理層及數據鏈路層的協議.以太網幀所傳送的數據是網絡層規定的數據包.如果要使用IP網絡協議,則IP數據包就將存儲在以太網幀的報文處.
幀的尾部是檢查數據錯誤的錯誤校驗及修正碼.一般錯誤的檢驗方法有奇偶校驗等方法,但以太網中常使用循環冗余校驗(CRC: Cyclic Redundancy Check)檢查錯誤.CRC中,將表示幀的位列作為多項式.把多項式與准備好的特定多項式相除,得出的結果與數據一同發送.在接收端重新進行一次除法運算,用其結果確認傳送來的數據正確與否.使用CRC不但能檢查出是否有錯誤,而且還能在接收端修正錯誤.但是,以太網在檢查出錯誤時,該幀將被刪除重新發送.
轉發網絡集線器是不能識別MAC地址的,它將以太網幀向全部端口中繼.開關網絡集線器也被稱為二層開關.這是因為開關網絡集線器是按照數據鏈路層協議即第二層協議來解釋以太網幀的.使用開關網絡集線器與計算機一對一連接起來后,通信線路也完全變成一對一.即發生不了CSMA/CD所預想的沖突.這時接收和發送是並行的,這樣的通信稱為全雙工通信.而普通的以太網通信線路稱為半雙工通信.因為在全雙工通信中,接收和發送能並列進行,所以通信速度是半雙工的2倍.
1.2 IP數據報的構成
以太網幀中的數據段通常IP數據報或與IP有關的其他協議,包括ARP(Address Resolution Protocol),ICMP(Internet Control Message Protocol)等.
1.2.1 IP地址
通常所說IP地址是指現在所使用的第四版本的Ipv4地址協議.其中的IP是以32位的二進制數來表示的.通常按8位分成4段,用十進制的數值表示,中間用點號分開.因此IP地址的數值可以從0.0.0.0到255.255.255.255.
計算機地址除了0和全部為1得數值外都可以使用.計算機地址為0時,在網路地址中指定為指向網絡本身.計算機地址全部為1時,網絡地址指定為向全體網絡進行通信廣播.網絡地址使用多少位取決於一個局域網能容納的計算機台數.因此,網絡地址的位數決定了IP地址的分類.
A類地址中網絡地址有7位,計算機地址被分配為24位.即具有A類地址的網絡在全世界只有100個左右,是能夠容納1600萬台計算機的網絡.B類地址使用方便,網絡數量和可容納的主機數都比較合適,造成現在B類地址資源不足,申請分配十分困難.C類地址目前還有大量剩余,但是由於一個單位中使用一個C類地址,常常不能容納自己網絡上所有的計算機,因此必須分配給相應的多個C類地址.這種情況下,需要使用把這些計算機作為一個網絡的無類別域際路由選擇(CIDR: Classless Inter-Domain Routing)技術,使用不受本來類別制約的地址.進行地址空間的再分配會擴大網絡地址的使用,在此種情況下分配的網絡稱為子網.使用子網時不能從IP地址的類別上區分IP地址中哪部分是網絡地址.D類地址是多點傳送地址,向多方傳送IP數據報.廣播會向所有的網絡設備傳送IP數據報,但是在多點傳送中希望接收數據的多台計算機可以接受到IP數據報.這種多點傳送可以將聲音,圖像等向多台網絡設備同時傳送,因此常被使用在利用網絡進行廣播的應用程序上.
在因特網中使用的IP地址,在世界范圍內是不重復的.但是對於因特網沒有對外公開的IP地址和其他網絡中發生重復是沒有關系的.因此,作為沒有公開的內部私有地址,要規定其使用范圍.RFC1918中對私有地址的規定是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
因此在內部私有網中的IP常常會是在以上范圍內.
下一代的IP地址為Ipv6,IP地址的位數達到128位,IP地址的個數可以達到現在的296倍.這樣Ipv4地址資源不足的問題將得到解決,而IP地址將域網絡結構相對應,更加提高路由的效率.
1.2.2 路由
路由器是工作在OSI參考模型第三層——網絡層的數據包轉發設備.路由器通過轉發數據包來實現網絡互連.雖然路由器可以支持多種協議(如TCP/IP,IPX/SPX,AppleTalk等協議),但是在我國絕大多數路由器運行TCP/IP協議.路由器通常連接兩個或多個由IP子網或點到點協議標識的邏輯端口,至少擁有1個物理端口.路由器根據收到數據包中的網絡層地址以及路由器內部維護的路由表決定輸出端口以及下一跳地址,並且重寫鏈路層數據包頭實現轉發數據包.路由器通過動態維護路由表來反映當前的網絡拓撲,並通過與網絡上其他路由器交換路由和鏈路信息來維護路由表.
在IP中,兩個以上的網絡間進行通訊時要使用路由器.路由器具有連接兩個或兩個以上網絡接口.路由器能將因特網上的IP數據報進行接力傳遞.路由器從直接連接在其上的網絡設備中得到的IP數據報,適當調整IP數據報的傳送方向后送出.因為IP數據報本身不含有在因特網上通過怎樣的傳送的路徑到達目的計算機的信息,所以IP數據報只依靠接收端的IP地址信息,通過多個路由器進行IP數據報的接力傳遞.
路由器具有兩大功能.數據通路功能:對於每個到達路由器的數據包,在不丟失的情況下,負責尋路.此功能主要包括:轉發決定,經由背板輸出鏈路隊列調度.轉發功能是通過專門硬件來實現的,每一個通過路由器的分組包都要執行這個操作.數據通路功能對改進路由器的性能是很重要的.控制功能:主要包括路由表的管理和系統的配置與管理,以及與相鄰路由器交換路由表信息,通過軟件實現等.這些功能不是針對每個數據包的,因此使用頻度相對低一些.
路由器要對到達的分組包進行識別,分類以決定其所應接受的服務類型.最初所考慮的方案是在網絡的核心,根據IP報頭的TOS(Type of Service)域來識別分組,但是在互聯網的發展過程中,由於一直采用"盡力"傳輸,同時由於終端在發送IP包時不考慮TOS,因此,TOS一直沒有發揮作用.目前在邊緣設備,根據IP分組的源IP地址,目的IP地址,源端口號,目的端口號,傳輸層協議類型來對分組進行識別.此外,為了實現防火牆的功能也需要對IP分組進行識別.
在識別時,每條識別規則采用的是源IP地址,目的IP地址,源端口號,目的端口號,傳輸層協議類型.在上述識別規則中,每個域都可能是一個區間.例如有這樣一條識別規則"202.66.83.X,202.66.72.X,X,23,TCP"(X表示任意),這條規則識別從網絡202.66.83.X到網絡202.66.72.X的telnet數據.從幾何的角度來看,假如判別時利用了IP報頭的K個域,這個問題實際上是在一個K維空間中有許多互相交疊的實體(每條判別規則對應於一個實體),每當有一個分組到達時,該分組相當於K維空間上的一個點,進行判別實際上是要找出包含該點的優先級最高的實體.
IP數據報的路由是按照路由表安排的.路由表即記錄着某台網絡設備把IP數據報傳送到其他網絡設備的數據結構.不只是路由器具有路由表,所有使用網絡層協議的網絡設備都具有路由表.包括計算機,路由器和L3交換器(路由器組)等.
在路由表中,以組的形式記錄着IP數據報要傳送到目的計算機的IP地址和為達到最終目的地必須經過的路由器IP地址.例如在此網絡中的計算機下面這張路由表
接收端
接下來發送地址
192.168.1.0
直接發送到接收端計算機
Default(缺省)
192.168.1.254
路由表
這表示如果接收端的IP地址屬於自己的局域網,那就使用數據鏈路層協議的功能將IP數據報直接發給對方,如果是其它則向局域網中存在的路由器發送IP數據報.路由器具有的路由表是很復雜的.在上面的例子中,路由器兩側連接的計算機可以使用各自具有的數據鏈路層協議進行直接通信.除此以外在進行計算機通信時,還必須向鄰近的路由器發送IP數據報,並進行IP數據報的接力傳遞.
路由器收到數據包以后,會根據數據包中目的地址到路由表中查找相應的路由條目,如果找到相匹配的路由就會按照該路由處理數據包,否則在缺省情況下會扔棄數據包
.路由表的形成有靜態路由和動態路由兩種.靜態路由時手動記錄路由表,適用於小局域網,一點網絡的規模稍微增大則會變得非常麻煩,當網絡變更時也需要手動修改.動態路由就是自動交換路由信息,生成路由表.動態路由的協議中有網絡內部使用的內部網關協議(IGP)和網絡間使用的外部網關協議(EGP).
過去,路由器被看作是最佳轉發數據包的硬件設備,軟件僅提供監視器的功能.但隨着路由器的發展,軟件在路由器中起的作用越來越大.實際上,實時操作系統(如,通信領域常用PSOS和VxWorks)的選擇對一個通信產品來說是至關重要的.如果要開發效率很高的軟件,需要操作系統廠商的支持.像Cisco公司,就是自己開發專用的路由器操作系統以及應用軟件.如果這種趨勢繼續發展,終端用戶將來可以很方便地在路由器上裝載各種應用軟件模塊,使路由器能夠提供防火牆,流量管理策略,特殊應用信令,路由策略等功能.
路由器的數據報處理能力對網絡的處理能力影響十分大,所以開發了使用硬件進行高速路由的設備.這樣的路由器是在開關網絡集線器中附加路由功能,被稱為L3交換機.
1.2.3 IP數據報的構成
IP數據報的最開始存放着IP的版本(version).Ipv4版本存放為4.
接下來IHL是一個字符,即以32位為一個單位,存放着從版本開始到填充結束的報頭的長度.最短的情況沒有選項,這是IHL的值為5.
服務類型字段(type of service)表示IP數據報在傳遞時發送端要求的品質.第七位是為將來預留的擴展位.
數據報長度字段(total length)以8位為一個單位,即字節表示IP數據報的長度.接下來的標識字段(identification),從TCP等上層協議調用時IP數據報的標識號.
標志字段(flags)和數據塊偏移(fragment offset)用於對數據塊偏移的處理.IP數據報要在數據鏈路層的協議規定下裝入幀的報文中傳送,由於IP數據報中,報文部分最大就有65535為,數據鏈路層的幀是不能全部容納的,所以采用叫做分塊的方法.分割的數據稱為碎塊.IP數據報的標志表示有無碎塊,數據塊偏移用於保證數據塊偏移按照正確的順序處理.
TTL字段是為了防止錯誤的IP數據報在網絡上循環,賦予IP數據報一定的壽命.IP數據報在發送時就在TTL字段中設置其壽命.TTL字段的值在IP數據報每通過一次路由器時,進行一次衰減.當為0時,IP數據報就被刪除.通常設為最大值255.
協議字段(protocol)中存放着表示TCP等IP的上層協議的值.包括ICMP,TCP,EGP,IGP,UDP等.
在檢查錯誤的報頭校驗碼(header checksum)的后面是發送端地址和目的地址,他們在Ipv4中都為32位.最后存放的是選項和把報頭進行32位整數化后余下的位.
version
IHL
type of service
Total length
Identification
flags
fragment offset
TTL
protocol
Header checksum
96位
IP數據報頭的結構
1.2.4 其它報文結構
比較重要的有地址解析協議和Internet控制信息協議.地址解析協議(ARP:Address Resolution Protocol)是連接網絡層和數據鏈路層的,於IP沒有直接的聯系,它是采用以太網的IP網絡中必需的協議.
在ARP中進行的處理是對應於以太網的物理地址(MAC地址)和IP地址.把IP數據報傳送到其他計算機時,要從對方的IP地址中查詢對方的物理地址,使用對方的物理地址建立新的以太網幀.在使用IP進行通信時,就必須知道IP地址和對應的MAC地址.先進行以太網的廣播功能,將要查詢的MAC地址的網絡設備的IP地址通知給其他網絡設備.得到消息的網絡設備進行匹配,符合則將自己的MAC地址返回過去.從ARP中取得的IP地址和MAC地址的對應關系,保持一段時間用於通信,一段時間后就被刪除.把ARP反過來考慮從MAC地址查詢IP地址的情況用RARP(Reverse ARP),RARP包和ARP包具有相同的結構,只是ARP包的操作號以后的內容不一樣.ARP的操作號為1(請求)和2(響應),請求查詢時對象的MAC地址為空,RARP操作號為3(請求)和4(響應),請求時的IP地址為空.
在網上通信,可能發生各種情況導致數據包被破壞,造成數據包在網絡上循環,這時路由器等網絡設備將刪除數據包,然后向發送端請求重新發送數據包.這種通信方式就是由ICMP決定的.ICMP是把消息裝入到IP數據報的報文部傳送的.從這種意義上來說,ICMP與TCP,UDP相同,都屬於傳輸層的協議.但從功能上ICMP具有補充IP的功能.
ICMP是"Internet Control Message Protocol"(Internet控制消息協議)的縮寫.它是TCP/IP協議族的一個子協議,用於在IP主機,路由器之間傳遞控制消息.控制消息是指網絡通不通,主機是否可達,路由是否可用等網絡本身的消息.這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用.
1.3 TCP/UDP
1.3.1 TCP/UDP的作用
傳輸控制協議(TCP)和用戶數據報協議(UDP)是在因特網上傳輸層使用的協議.使用網絡層的IP協議,可以從世界上任何一台計算機中找到特定的通信對象,並向其發送數據.傳輸層的協議提供的是連接指定在對方計算機上運行的特定應用程序和希望得到的網絡服務.
TCP及UDP中使用的是端口的概念,以區別計算機上的程序.端口是應用程序在網絡通信上使用的數據輸入輸出口.當某一網絡客戶端利用其他計算機上的服務程序時,在根據IP地址指定服務計算機的同時,也指定了被分配的服務程序的公認端口號.由此,可以利用與端口號對應的特定的網絡服務.
TCP/UDP數據報
IP數據報
通常的過程如下:客戶端程序從用戶處得到運行服務器程序的計算機DNS名和服務器程序的應用程序名.客戶端程序利用從用戶處得到的DNS名檢索DNS服務器,得到連接對象的計算機的IP地址.並且從應用程序名中檢索到服務器程序的公認端口號.再從應用程序名中決定作為傳輸層協議是使用TCP還是UDP.然后從對方的IP地址,自己的IP地址,對方的端口號及指定TCP或UDP中,建立將TCP或者UDP存放到報文的IP數據報.運行系統再把通信上的合適端口分配給客戶端程序.這樣就確定了由IP地址,端口號及TCP或UDP組成的世界上不重復的數據組合.客戶端程序把含有TCP/UDP數據包的IP數據報發送出去,服務程序將響應同樣發給客戶端程序.
TCP協議是基於連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接.一個TCP連接必須要經過三次"對話"才能建立起來,其中的過程非常復雜,我們這里只做簡單,形象的介紹,你只要做到能夠理解這個過程即可.我們來看看這三次對話的簡單過程:主機A向主機B發出連接請求數據包:"我想給你發數據,可以嗎 ",這是第一次對話;主機B向主機A發送同意連接和要求同步(同步就是兩台主機一個在發送,一個在接收,協調工作)的數據包:"可以,你什么時候發 ",這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:"我現在就發,你接着吧!",這是第三次對話.三次"對話"的目的是使數據包的發送和接收同步,經過三次"對話"之后,主機A才向主機B正式發送數據.
TCP和UDP把端口通信功能提供給應用程序.但是TCP和UDP 在性質上由差別.TCP中補充了IP沒有提供的網絡功能,在兩個程序之間提供一條沒有錯誤的全雙工通信線路.所有使用TCP為傳輸層協議的應用程序要利用網絡是十分方便的.數據的再次發送,錯誤處理和數據包到達順序的控制等處理在TCP的處理部分進行,在應用程序上不需要進行相關的處理.但是,為了提供面向連接這種高級功能,TCP對計算機系統來說負載很大,速度較慢.
它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去.UDP只是在IP的功能中追加了端口功能的簡單結構.因此,對要求處理速度的應用程序提供了傳輸層功能.UDP中連接和數據的順序控制等功能由應用程序來完成.這種性質被稱為無連接.所以在錯誤少的局部環境下並要求快速的應用程序中,常用UDP來實現.UDP適用於一次只傳送少量數據,對可靠性要求不高的應用環境.比如,我們經常使用"ping"命令來測試兩台主機之間TCP/IP通信是否正常,其實"ping"命令的原理就是向對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的.例如,在默認狀態下,一次"ping"操作發送4個數據包.發送的數據包數量是4包,收到的也是4包(因為對方主機收到后會發回一個確認收到的數據包).這充分說明了UDP協議是面向非連接的協議,沒有建立連接的過程.正因為UDP協議沒有連接的過程,所以它的通信效果高;但也正因為如此,它的可靠性不如TCP協議高.QQ就使用UDP發消息,因此有時會出現收不到消息的情況.
1.3.2 TCP/UDP報文結構
TCP報文頭開始部分存放的是發送端端口號(source port)和接收端的端口號(destination port),順序號(sequence)中存放的是按照發送順序處理的相關數值.用來表示將某消息段中的數據位全體數據塊的字節數與進行通信時某一個規定的偏移量相加后的數值.
確認號(acknowledgment number)是接收端對於發送端接收到的數據塊狀態的順序號.具有4位的數據偏移字段(data offset)是以32位為一個單位存放報頭長度的數值.從TCP
Source port
destination port
Sequence
acknowledgment number
1
2
3
window
checksum
urgent pointer
options, padding
96位
1:data offset 2:reserved 3:control bits
TCP數據報頭的結構
消息段開始的部分到數據偏移×4字節后存放的就是TCP的報文部分.
用於擴展的6位字段后面是控制位(control bits).控制位是6位標志的集合,表示TCP以怎樣的狀態進行通信.控制位的位置在1為URG,表示緊急數據指針有效;控制位在2為ACK,表示確認號有效;控制位在3為PSH,表示傳送強制功能;控制位在4為RTS,表示請求連接重新設置;控制位在5為SYN,表示請求順序號同步處理;控制位在6為FIN,表示發送結束.
Window表示接收端緩存的數值.接下來檢查錯誤用的校驗碼(checksum)和為處理緊急數據而配置的緊急數據指針(urgent pointer),最后放的是選擇和填充(options, padding)
UDP數據報構造相對比較簡單.UDP數據報中含有作為傳輸層協議實現接收所必需的端口號字段,數據報長度及錯誤檢查用校驗碼.UDP能進行高速的信息傳遞,但數據報順序控制的工作要由應用程序來完成.UDP這種協議只是在IP提供的功能中加上了端口的概念,是簡單的傳輸層協議.
source port
destination port
length
checksum
data
UDP數據報的結構
