實驗目的
理解TCP報文首部格式和字段的作用,TCP連接的建立和釋放過程,TCP數據傳輸過程中編號與確認的過程。
2. 實驗環境
聯網環境,可以是局域網,也可以是連入Internet
3. 實驗步驟
(1)啓動Etherel協議分析軟件,並開始抓包。
(2)啓動某個基於TCP的應用程序,例如連接某個FTP站點,或通過瀏覽器訪問某個網頁。
(3)等出現瀏覽的網頁後停止數據包的捕獲。
(4)出現協議分析界面,將filter 一欄填入tcp,則只顯示TCP協議信息,通過此信息,可以看到TCP連接的三次握手過程和協商的初始的序列號,數據傳輸過程以及拆除連接的相應信息。
4. 實驗原理
TCP在網絡OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層。在第二層上的數據,我們叫Frame,在第三層上的數據叫Packet,第四層的數據叫Segment。
我們程序的數據首先會打到TCP的Segment中,然後TCP的Segment會打到IP的Packet中,然後再打到以太網Ethernet的Frame中,傳到對端後,各個層解析自己的協議,然後把數據交給更高層的協議處理。
o SequenceNumber是包的序號,用來解決網絡包亂序(reordering)問題。
o AcknowledgementNumber就是ACK——用於確認收到,用來解決不丟包的問題。
o Window又叫Advertised-Window,也就是著名的滑動窗口(SlidingWindow),用於解決流控的。
o TCPFlag ,也就是包的類型,主要是用於操控TCP的狀態機的。
對於建立鏈接的3次握手,主要是要初始化SequenceNumber 的初始值。通信的雙方要互相通知對方自己的初始化的Sequence Number(縮寫爲ISN:Inital Sequence Number)——所以叫SYN,全稱Synchronize Sequence Numbers。也就上圖中的 x 和 y。這個號要作爲以後的數據通信的序號,以保證應用層接收到的數據不會因爲網絡上的傳輸的問題而亂序(TCP會用這個序號來拼接數據)。
對於4次揮手,其實你仔細看是2次,因爲TCP是全雙工的,所以,發送方和接收方都需要Fin和Ack。只不過,有一方是被動的,所以看上去就成了所謂的4次揮手。如果兩邊同時斷連接,那就會就進入到CLOSING狀態,然後到達TIME_WAIT狀態。下圖是雙方同時斷連接的示意圖(你同樣可以對照着TCP狀態機看)
4.實驗過程:
1.在IP地址爲 192.168.0.250的主機A的命令行窗口裏輸入telnet 218.65.113.46 會發現連接不上,因爲23號端口沒有打開。打開IP地址爲218.65.113.46的主機B的瀏覽器和主機A的抓包軟件Irris,然後在主機A命令行輸入telnet 218.65.113.46 80,過濾TCP及80,23端口,捕獲TCP協議數據包,並分析。
這是第一次握手: IP地址爲192.168.0.250的主機A向IP地址爲218.65.113.46的主機B發送連接請求,A隨機初始化自己的序列號50596762,確認號爲0,初始化A的接收窗口大小爲16384,發送SYN=1,此時ACK=0。
2.
3.
第三次握手: 主機A對主機B做確認,SYN=0,ACK=1,序列號爲上一幀的確認號,確認號爲B第二次握手的序號加1。
4.第四幀爲IP地址爲192.168.0.250的主機A向IP地址爲218.65.113.46的主機B發送的幀
實驗分析
(1)TCP 協議是面向字節的。TCP 將所要傳送的報文看成是字節組成的數據流,並使每一個字節對應於一個序號。在連接建立時,雙方要商定初始序號。TCP 每次發送的報文段的首部中的序號字段數值表示該報文段中的數據部分的第一個字節的序號。 TCP 的確認是對接收到的數據的最高序號表示確認,表示接收端期望下次收到的數據中的第一個數據字節的序號。TCP是期望確認和累積確認。
(2)TCP屬於SR(選擇性重傳),即發送方某個分組出錯或丟失只重傳該分組。接收方增加接受窗口(接受緩存),若收到的分組在接收窗口內且亂序,緩存該分組,等到分組按序後一起提交,接受窗口的大小一般等於發送方窗口的大小。
(3)TCP建立連接的過程稱爲3次握手,第一次握手(syn=1,ack=0,sn1=隨機數,ackno=0),第二次握手(syn=1,ack=1,sn2=隨機數,ackno=sn1+1),第三次握手只是對第二次作確認。TCP 釋放連接的過程置FIN標記爲1。
(4)TCP的流量控制指的是接收方明確地通過接收窗口大小,限制發送方發送窗口的最大值,從而達到接收方能夠擁有足夠的緩存接收數據的目的。TCP流量控制:發送端如果發送的數據很小,第一次會照常發送,後面的會等待(這裏windows是200ms)等發送數據較大時再放入TCP段中發送。可以在命令行輸入telnet IP地址 21,IP地址主機打開ftp服務器,連接上後,輸入ab,會分別打包a,b發送個對方。如果快速的輸入abc,則第一次發a,第二次就會有bc一起發送出去。(這裏不抓包做實驗分析。)