搞了n天的tcp/ip協議,才漸漸的明白,tcp和ip是兩個不同層上的協議,而且也不一樣,tcp是架在ip上的,當然,ip不僅可以包含tcp,也可以包含udp,至于他們其中的復雜關系,我也不知道,只知道,現在的互聯網,大多數用tcp協議。所以就搞了一下。
對于tcp而言,2個問題,第一個是握手和揮手,第二個是數據傳輸。 握手和揮手時,并不傳輸真正的數據。只有在握手后,揮手前,才可進行有效數據的傳輸。對于tcp的協議程序,首先要處理握手,因為不進行握手,是無法傳輸數據的,這當然只是協議定義的,如果對于底層而言,就沒有這么復雜了,但對于網絡這樣龐雜的系統來說,建立一個有效穩定的連接還是挺重要的。
那么程序首先,要對數據幀進行拆解,核對去掉以太網幀,核對去掉ip幀,在ip幀中,判斷協議是否為tcp協議(即一幀開始的第23位是否為06),當得知ip包內封裝的是tcp協議后,我們就可以開始判斷該tcp包是握手揮手包還是數據包了。對于下位機而言,如果不在程序上做處理,對于任何包,底層都可以接收。但我們必須要按照tcp協議規定的那樣來做,首先要判斷是否建立連接,如果沒有,則只接收握手包,而丟棄數據包和揮手包。
判斷握手包和揮手包在幀的第47個位,0x01(揮手),0x02(握手),0x10(應答),0x11(揮手應答),0x12(握手應答),0x18(傳輸數據),只要判斷47位數據符合哪個即可做相應處理。
握手過程為:
a:發送0x02給b,b:回復0x12給a,a:發送0x10給b
同時a在發送握手數據時會帶一個序列號,當比收到序列號時,加1后會回給a
握手后建立連接,建立連接后即可發送數據
發送數據時,判斷幀的第47位是否為0x18,若是,則可將數據推入應用層。