IP基礎--8.TCP封包(轉)

post0發表於2007-08-09
IP基礎--8.TCP封包(轉)[@more@]

一直以來人們總愛將TCP和IP合在一起來講是因為它們之間的密切關所至。同時我們也知道IP工作於網路層而TCP則工作於傳送層故此它們的封包格式卻是不一樣的。

TCP封包格式

下面就讓我們看一看TCP封包的格式

Source Port (16) | Destination Port (16)

Sequence Number (32)

Acknowledgment Number (32)

Data Offset(4) | Reserved (6)|UGR|ACK|PSH|RST|SYN|FIN|Window(16)

Checksum (16) | Urgent Pointer (16)

Options (0 or more 32 bit words + padding)

DATA

...

今次我不再為每一個TCP封包部件擷取樣板了只打算略略討論一下它們的名稱和定義

Source Port & Destination Port

如果我們將IP比喻成地址那麼Port可以說是門口了試想一下一座大樓有前門後門側門送貨的門出貨的門倒垃圾的門扔死屍的門等等亂七八糟的門...... 那麼一個IP地址也有著好多個各種功能的port而每一個port都被不同的服務傾聽著就好比看門人一樣。下面是一些常用port和其對應的服務有興趣的朋友可以在Linux的/etc/services這個檔案找到它們

ftp-data 20/tcp

ftp 21/tcp

telnet 23/tcp

smtp 25/tcp mail

www 80/tcp http # WorldWideWeb HTTP

www 80/udp # HyperText Transfer Protocol

pop-3 110/tcp # POP version 3

pop-3 110/udp

其實port號碼可以隨您喜歡任意指定給哪些服務使用但為了避免“找錯門口”的情形出現(除非您故意想躲起來)人們將一些比較常用的服務(Well known services)的port號碼固定下來了。但是在TCP資料傳送過程中可能同時要處理一個以上的封包程式也會建立多個port來避免突。在兩臺主機進行資料傳送的時候來源地的port和目的地的port都必須讓TCP知道才行。

Sequence Number

傳送序號。當資料要從一臺主機傳送去另一臺主機的時候傳送端會為封包建立起一個初始號碼然後按照所傳送的位元組數依次的遞增上去那麼下一個封包的序號就會使用遞增之後的值來作為它的序號了。這樣接收端就可以根據序號來檢測資料是否接收完整了。

Acknowledgement Number

回應序號。當接收端接收到TCP封包之後透過檢驗確認之後然後會依照傳送序號產生一個回應序號發出一個回應封包給傳送端這樣接收端就知道剛才的封包已經被成功接收到了。

可是如果由於網路狀況或其它原因當封包的TTL值達到期限時接收端還沒接收到回應序號就會重發該個被以為丟失了的封包。但如果剛好重發封包之後才接收到回應呢這時候接收端就會根據序號來判斷該封包是否被重傳送如果是的話很簡單將之丟棄不做任何處理就是了。

Data Offset

這是用來記錄標頭固定長度用的和IP封包的IHL差不多如果options沒設定的話其長度就是20byte用十六進位表示就是 0x14了。

Reserved

這是保留區間暫時還沒被使用。

Contral Flag

控制標記。一個有六個它們分別是

Urgent data

當URG被設定為1的時候就表示這是一個攜有緊急資料的封包。

Acknowledgment field significant

當ACK為1的時候表示此封包屬於一個要回應的封包一般都會為1。

Push function

如果PSH為1的時候此封包所攜帶的資料就會被直接上遞給上層的應用程式而無需經過TCP處理了。

Reset

如果RST為1的時候表示要求重新設定封包再重新傳遞。

Synchronize sequence number

如果SYN為1時表示要求雙方進行同步溝通。

No more data fro sender (Finish)

如果封包的FIN為1的時候就表示傳送結束然後雙方發出結束回應進而正式終止一個TCP傳送過程。

Window

我們都知道MS Windows是什麼東西但這裡的Window卻非作業系統的“視窗”哦我們稱這裡的視窗為“滑動視窗(Sliding Window)”。為什麼我們需要使用視窗呢

正如您剛才看到的TCP封包會透過SQN和ACK序號來確保傳送的正確性但如果每一個封包都要等上一個封包的回應才被髮送出去的話實在是太慢和難以接受的。這樣我們可以利用Sliding Window在傳送兩端劃分出一個緩圍規定出可以一次性傳送的最大封包數目

當TCP傳送建立起來之後兩端都會將window的設定值還原到初始值比方說每次傳送3個封包。然後傳送端就一次過傳送三個封包出去然後視窗則會往後移動三個封包填補傳送出去之封包的空缺。如果接收端夠順利也能一次處理接收下來的三個封包的話就會告訴傳送端的window值為3但如果接收端太忙或是其它因素影響暫時只能處理兩個封包那麼在視窗裡面就剩下一個封包然後就會告訴傳送端window值為2。這個時候傳送端就只送出兩個封包而視窗就會往後移動兩個封包填補傳送出去的空缺。您明白為什麼這個視窗會“滑動”了吧

Chechsum

當資料要傳送出去的時候傳送端會計算好封包資料大小然後得出這個檢驗值封包一起傳送當接收端收到封包之後會再對資料大小進行計算看看是否和檢驗值一致如果結果不相稱則被視為殘缺封包會要求對方重發該個封包。

Urgent Pointer

還記得剛才講到Control Flag的時候我們提到一個URG的標記嗎如果URG被設定為一的時候這裡就會指示出緊急資料所在位置。不過這種情形非常少見例如當資料流量超出頻寬的時候系統要求網路主機暫緩傳送資料所有主機收到這樣的資訊都需要優先處理。

Option

這個選項也比較少用。當那些需要使用同步動作的程式如Telnet要處理好終端的互動模式就會使用到option來指定資料封包的大小因為telnet使用的資料封包都很少但又需要即時回應。

Option的長度要麼是0要麼就是32bit的整倍數即使資料不足數也要使用標頭中沒有的資料來填夠。

下面我們擷取一個TCP封包看看您能從其中解讀出什麼意思

UDP還是TCP

在TCP/IP的網路IP封包會透過ICMP協定來檢測對方的存在而確保最大可能性的正確傳送。不過在傳送層裡面除了TCP這個協定之外我們還使用另一個傳輸協定就是UDP (User Datagram Protocol)他和TCP最大的分別是不偵測對方的存在就直接將資料送給對方而假設對方會自行接收。

這樣對那些需要大樓資料存取而又不要求可靠傳輸的程式如聲音傳遞可以省卻雙方的溝通和確認時間從而提高資料傳輸量。使用UDP的程式協定例如有DNSSNMPNFSBOOTP等等。

協定 優點 缺點

TCP 傳送穩定資料傳送成功率高。 速度比較慢。

UDP 傳輸量大迅速。 不穩定容易遺失資料

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938779/,如需轉載,請註明出處,否則將追究法律責任。

相關文章