??TCP/IP(Transmission Control Protocol/Internet Protocol) 即傳輸控制協(xié)議/網(wǎng)間協(xié)議亥贸,是一個工業(yè)標準的協(xié)議集贱迟,它是為廣域網(wǎng)(WAN)設計的们镜。它是由ARPANET網(wǎng)的研究機構發(fā)展起來的缴渊。
??TCP/IP的標準在一系列稱為RF [1] C的文檔中公布仑乌。文檔由技術專家兑燥、特別工作組亮瓷、或RFC編輯修訂。公布一個文檔時降瞳,該文檔被賦予一個RFC編號嘱支,如RFC959(FTP的說明文檔)、RFC793(TCP的說明文檔)、RFC791(IP的說明文檔)等除师。最初的RFC一直保留而從來不會被更新赢织, [1] 如果修改了該文檔,則該文檔又以一個新號碼公布馍盟。因此,重要的是要確認你擁有了關于某個專題的最新RFC文檔茧吊。通常在RFC的開頭部分贞岭,有相關RFC的更新(update)、排錯(errata)搓侄、作廢(obsolete)信息瞄桨,提示讀者信息的時效性。
首部格式
TCP的首部格式圖如下所示:
---Source Port是源端口讶踪,16位芯侥。
---Destination Port是目的端口,16位乳讥。
---Sequence Number是發(fā)送數(shù)據(jù)包中的第一個字節(jié)的序列號柱查,32位。
---Acknowledgment Number是確認序列號云石,32位唉工。
---Data Offset是數(shù)據(jù)偏移,4位汹忠,該字段的值是TCP首部(包括選項)長度除以4淋硝。 [1]
---標志位: 6位,URG表示Urgent Pointer字段有意義:
ACK表示Acknowledgment Number字段有意義
PSH表示Push功能宽菜,RST表示復位TCP連接
SYN表示SYN報文(在建立TCP連接的時候使用)
FIN表示沒有數(shù)據(jù)需要發(fā)送了(在關閉TCP連接的時候使用)
Window表示接收緩沖區(qū)的空閑空間谣膳,16位,用來告訴TCP連接對端自己能夠接收的最大數(shù)據(jù)長度铅乡。
---Checksum是校驗和继谚,16位。
---Urgent Pointers是緊急指針隆判,16位犬庇,只有URG標志位被設置時該字段才有意義,表示緊急數(shù)據(jù)相對序列號(Sequence Number字段的值)的偏移侨嘀。
連接建立
TCP是因特網(wǎng)中的傳輸層協(xié)議臭挽,使用三次握手協(xié)議建立連接。當主動方發(fā)出SYN連接請求后咬腕,等待對方回答
SYN+ACK [1] 欢峰,并最終對對方的 SYN 執(zhí)行 ACK 確認。這種建立連接的方法可以防止產生錯誤的連接,TCP使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議纽帖。 [1]
TCP三次握手的過程如下:
客戶端發(fā)送SYN(SEQ=x)報文給服務器端宠漩,進入SYN_SEND狀態(tài)。
服務器端收到SYN報文懊直,回應一個SYN (SEQ=y)ACK(ACK=x+1)報文扒吁,進入SYN_RECV狀態(tài)。
客戶端收到服務器端的SYN報文室囊,回應一個ACK(ACK=y+1)報文雕崩,進入Established狀態(tài)。
三次握手完成融撞,TCP客戶端和服務器端成功地建立連接盼铁,可以開始傳輸數(shù)據(jù)了。
連接終止
建立一個連接需要三次握手尝偎,而終止一個連接要經(jīng)過四次握手饶火,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示致扯。 [1]
(1) 某個應用進程首先調用close肤寝,稱該端執(zhí)行“主動關閉”(active close)。該端的TCP于是發(fā)送一個FIN分節(jié)急前,表示數(shù)據(jù)發(fā)送完畢醒陆。
(2) 接收到這個FIN的對端執(zhí)行 “被動關閉”(passive close),這個FIN由TCP確認裆针。
注意:FIN的接收也作為一個文件結束符(end-of-file)傳遞給接收端應用進程刨摩,放在已排隊等候該應用進程接收的任何其他數(shù)據(jù)之后,因為世吨,F(xiàn)IN的接收意味著接收端應用進程在相應連接上再無額外數(shù)據(jù)可接收澡刹。
(3) 一段時間后,接收到這個文件結束符的應用進程將調用close關閉它的套接字耘婚。這導致它的TCP也發(fā)送一個FIN罢浇。
(4) 接收這個最終FIN的原發(fā)送端TCP(即執(zhí)行主動關閉的那一端)確認這個FIN。 [1]
既然每個方向都需要一個FIN和一個ACK沐祷,因此通常需要4個分節(jié)嚷闭。
注意:
(1) “通常”是指赖临,某些情況下胞锰,步驟1的FIN隨數(shù)據(jù)一起發(fā)送,另外兢榨,步驟2和步驟3發(fā)送的分節(jié)都出自執(zhí)行被動關閉那一端嗅榕,有可能被合并成一個分節(jié)顺饮。 [2]
(2) 在步驟2與步驟3之間,從執(zhí)行被動關閉一端到執(zhí)行主動關閉一端流動數(shù)據(jù)是可能的凌那,這稱為“半關閉”(half-close)兼雄。
(3) 當一個Unix進程無論自愿地(調用exit或從main函數(shù)返回)還是非自愿地(收到一個終止本進程的信號)終止時,所有打開的描述符都被關閉帽蝶,這也導致仍然打開的任何TCP連接上也發(fā)出一個FIN赦肋。
無論是客戶還是服務器,任何一端都可以執(zhí)行主動關閉励稳。通常情況是金砍,客戶執(zhí)行主動關閉,但是某些協(xié)議麦锯,例如,HTTP/1.0卻由服務器執(zhí)行主動關閉琅绅。 [2]