TCP報文格式,TCP的三次握手和四次揮手&hosts文件

1.TCP報文格式服務器

TCP報頭中的源端口號和目的端口號IP數據報中的源IP與目的IP惟一肯定一條TCP鏈接網絡

序號(4字節=32):tcp

    37 59 56 75spa

    用來標識TCP發端向TCP收端發送的數據字節流.net

確認序號(4字節=32):計算機網絡

    因爲該報文爲SYN報文,ACK標誌爲0,故沒有確認序號(ACK標誌爲1時確認序號纔有效)TCP協議規定,只有ACK=1時有效,也規定鏈接創建後全部發送的報文的ACK必須爲1指針

    一旦鏈接創建,該值將始終發送(同ACK標誌)blog

頭部長度:該字段佔用4位,用來表示報文首部的長度,單位是4Byte。如:headLen = ((packet[12]>>4)&0x0F)*4;ip

預留6位:長度爲6位,做爲保留字段,暫時沒有什麼用處。資源

 

URG:長1位,表示緊急指針字段有效;

ACK:長1位,置位表示確認號字段有效;TCP協議規定,只有ACK=1時有效,也規定鏈接創建後全部發送的報文的ACK必須爲1

PSH:長1位,表示當前報文須要請求推(push)操做;

RST:長1位,置位表示復位TCP鏈接;

SYN:長1位,在鏈接創建時用來同步序號。當SYN=1而ACK=0時,代表這是一個鏈接請求報文。對方若贊成創建鏈接,則應在響應報文中使SYN=1和ACK=1. 所以,SYN置1就表示這是一個鏈接請求或鏈接接受報文。

FIN:長1位,用於釋放TCP鏈接時標識發送方比特流結束即完,終結的意思用來釋放一個鏈接。當 FIN = 1 時,代表此報文段的發送方的數據已經發送完畢並要求釋放鏈接。

窗口大小:長度爲16位,2個字節。

校驗和:長度爲16位,2個字節。

緊急指針:長度爲16位,2個字節。

以上是TCP包頭必需要有的字段,也稱固有字段,長度爲20個字節。

 

2.TCP三次握手

TCP怎樣才能保證可靠的傳輸任務,就是經過三次握手

首先由Client發出請求鏈接即 SYN=1 ACK=0  (請看頭字段的介紹), TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,所以聲明本身的序號是 seq=x

而後 Server 進行回覆確認,即 SYN=1 ACK=1 seq=y, ack=x+1,

再而後 Client 再進行一次確認,但不用SYN 了,這時即爲 ACK=1, seq=x+1, ack=y+1.

 

3.TCP四次揮手

  當客戶A 沒有東西要發送時就要釋放 A 這邊的鏈接,A會發送一個報文(沒有數據),其中 FIN 設置爲1,  服務器B收到後會給應用程序一個信,這時A那邊的鏈接已經關閉,即A再也不發送信息(但仍可接收信息)。

  A收到B的確認後進入等待狀態,等待B請求釋放鏈接, B數據發送完成後就向A請求鏈接釋放,也是用FIN=1 表示, 而且用 ack = u+1(如圖), A收到後回覆一個確認信息,並進入 TIME_WAIT 狀態, 等待 2MSL 時間。

爲何要等待呢?

爲了這種狀況: B向A發送 FIN = 1 的釋放鏈接請求,但這個報文丟失了, A沒有接到不會發送確認信息B 超時會重傳,這時A在 WAIT_TIME 還可以接收到這個請求,這時再回復一個確認就好了。(A收到 FIN = 1 的請求後 WAIT_TIME會從新記時)

另外服務器B存在一個保活狀態,即若是A忽然故障死機了,那B那邊的鏈接資源何時能釋放呢?  就是保活時間到了後,B會發送探測信息, 以決定是否釋放鏈接。

 注意:中斷鏈接端能夠是Client端,也能夠是Server端。

來個通俗版的解釋:

假設Client端發起中斷鏈接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了",可是若是你還有數據沒有發送完成,則沒必要急着關閉Socket,能夠繼續發送數據。因此你先發送ACK,"告訴Client端,你的請求我收到了,可是我還沒準備好,請繼續你等個人消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端肯定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉鏈接了"。Client端收到FIN報文後,"就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕Server端不知道要關閉,因此發送ACK後進入TIME_WAIT狀態,若是Server端沒有收到ACK則能夠重傳。「,Server端收到ACK後,"就知道能夠斷開鏈接了"。Client端等待了2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,我Client端也能夠關閉鏈接了Ok,TCP鏈接就這樣關閉了!(是服務端先關閉,後客戶端關閉

【問題1】爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?
答:由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。

【問題2】爲何TIME_WAIT狀態須要通過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,咱們能夠直接進入CLOSE狀態了,可是咱們必須假象網絡是不可靠的,有能夠最後一個ACK丟失。因此TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

整個客戶端所經歷的狀態:

整個服務端經歷的狀態:

栗子1:

TCP連接中主動斷開連接netstat觀察可能出現的狀態流轉是:CD

  A.ESTABLISHED->CLOSE_WAIT->TIME_WAIT->CLOSED

  B.ESTABLISHED->TIME_WAIT->CLOSE_WAIT->CLOSED

  C.ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

  D.ESTABLISHED->FIN_WAIT_1->TIME_WAIT->CLOSED

栗子2:

一條tcp鏈接,主動關閉的一方不可能出現的鏈接狀態是()A

  A.CLOSE_WAIT

  B.FIN_WAIT2

  C.TIME_WAIT

  D.FIN_WAIT1

4.關於Host文件

hosts文件 是一個用於儲存計算機網絡中各節點信息的計算機文件。
這個文件負責將主機名稱映射到相應的IP地址 。
hosts文件一般用於補充或取代網絡中 DNS 的功能。
和DNS不一樣的是,計算機的用戶能夠直接對hosts文件進行控制。

host文件一個沒有擴展名的系統文件,其做用就是用來存儲一些經常使用的網絡域名和與其對應的ip地址,當用戶輸入一個須要登陸的網址時,系統就會先去host文件中查找,若是找到了就當即打開該網址,若是找不到就去DNS域名解析服務器中查找。

參考文檔:http://blog.csdn.net/imilli/article/details/50620104

相關文章
相關標籤/搜索