TCP:傳輸控制協定
=====================
盡管TCP和UDP都使用相同的網絡層(IP),TCP卻向應用層提供與UDP完全不同的服務。TCP提供一種面向連接配接的、可靠的位元組流服務。面向連接配接意味着兩個使用TCP的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須先建立一個TCP連接配接。
TCP通過下列方式來提供可靠性:
1. 應用資料被分割成TCP認為最适合發送的資料塊。
2. 當TCP發出一個段後,它啟動一個定時器,等待目的端确認收到這個封包段。如果不能及時收到一個确認,将重發這個封包段。
3. 當TCP收到發自TCP連接配接另一端的資料,它将發送一個确認。這個确認不是立即發送,通常将推遲幾分之一秒.
4. TCP将保持它首部和資料的檢驗和。
5. 既然TCP封包段作為I P資料報來傳輸,而I P資料報的到達可能會失序,是以TCP封包段的到達也可能會失序。如果必要, TCP将對收到的資料進行重新排序,将收到的資料以正确的順序交給應用層。
6. 既然I P資料報會發生重複, TCP的接收端必須丢棄重複的資料。
7. TCP還能提供流量控制。TCP連接配接的每一方都有固定大小的緩沖空間。
TCP首部(通常20個位元組)
-----------------------------------
2位元組源端口号--2位元組目的端口号--4位元組位序号--4位元組确認序号--4位首部長度--6位保留--URG--ACK--PSH--RST--SYN--FIN--2位元組視窗大小--2位元組檢驗和--2位元組緊急指針--
TCP連接配接的建立與終止
------------------------------
TCP是一個面向連接配接的協定。無論哪一方向另一方發送資料之前,都必須先在雙方之間建立一條連接配接。
為了建立一條TCP連接配接:
1. 請求端發送一個SYNC段指明客戶打算連接配接的伺服器的端口,以及初始序号(ISN)。這個SYN段為封包段1。
2. 伺服器發回包含伺服器的初始序号的SYN封包段(封包段2)作為應答。同時,将确認序号設定為客戶的ISN加1以對客戶的SYN封包段進行确認。一個SYN将占用一個序号。
3. 客戶必須将确認序号設定為伺服器的ISN加1以對伺服器的SYN封包段進行确認(封包段3)。
三個封包段完成連接配接的建立,這個過程稱為三次握手(three-way handshake)。
a) Client --> Server
Source Destination Protocol Info
10.0.0.3 203.208.37.104 TCP 49968 > http [SYN] Seq=0 Win=8192 [TCP CHECKSUM INCORRECT] Len=0 MSS=1460 WS=2
Transmission Control Protocol, Src Port: 49968 (49968), Dst Port: http (80), Seq: 0, Len: 0
Source port: 49968 (49968)
Destination port: http (80)
Sequence number: 0 (relative sequence number)
Header length: 32 bytes
Flags: 0x02 (SYN)
0... .... = Congestion Window Reduced (CWR): Not set
.0.. .... = ECN-Echo: Not set
..0. .... = Urgent: Not set
...0 .... = Acknowledgment: Not set
.... 0... = Push: Not set
.... .0.. = Reset: Not set
.... ..1. = Syn: Set
.... ...0 = Fin: Not set
Window size: 8192
Checksum: 0xfb61 [incorrect, should be 0x345d (maybe caused by "TCP checksum offload"?)]
[Good Checksum: False]
[Bad Checksum: True]
Options: (12 bytes)
Maximum segment size: 1460 bytes
NOP
Window scale: 2 (multiply by 4)
SACK permitted
b) Server --> Client
Source Destination Protocol Info
203.208.37.104 10.0.0.3 TCP http > 49968 [SYN, ACK] Seq=0 Ack=1 Win=8190 Len=0 MSS=1452
Transmission Control Protocol, Src Port: http (80), Dst Port: 49968 (49968), Seq: 0, Ack: 1, Len: 0
Source port: http (80)
Destination port: 49968 (49968)
Acknowledgement number: 1 (relative ack number)
Header length: 24 bytes
Flags: 0x12 (SYN, ACK)
...1 .... = Acknowledgment: Set
Window size: 8190
Checksum: 0x6c42 [correct]
[Good Checksum: True]
[Bad Checksum: False]
Options: (4 bytes)
Maximum segment size: 1452 bytes
[SEQ/ACK analysis]
[This is an ACK to the segment in frame: 4]
[The RTT to ACK the segment was: 3.026885000 seconds]