1.TCP協議
- 1.
TCP
(Transmission Control Protocol
):傳輸控制協議- 2.
TCP
協議是一種面向連接的
、可靠的
、 基于字節流
的傳輸層通信協議
- 1.
面向連接
:兩個使用TCP
協議的應用(通常一個客戶和一個服務器)在彼此交換數據包之前必須先建立一個TCP
連接- 2.
可靠的
- 1.數據傳輸之前都要建立連接(
三次握手
),數據傳輸結束后都要釋放連接(四次揮手
)- 2.數據被分割成
TCP
認為適合發送的數據塊,而采用UDP
協議的數據長度將保持不變- 3.由
TCP
傳遞給IP
的信息單位稱為報文段或段segment
- 4.當
TCP
發出一個段后將啟動一個定時器,等待目的端確認收到這個報文段,如果不能及時收到一個確認,將重發這個報文段- 5.等待協議:客戶發送一次數據到服務端,必須等到服務端響應后才發第二次數據,中間的等待時間占了大部分時間,中間如果出現差錯(超時或確認丟失)都需要重新傳輸
- 5.
TCP
將保存首部和數據的檢驗和,這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化,如果收到段的檢驗和有差錯,TCP
將丟棄這個報文段并不確認收到此報文段,發送端需要重新發送- 3.
TCP
位碼即TCP
標志位共有六種
- 1.
SYN
(建立)- 2.
ACK
(確認)- 3.
PSH
(傳送)- 4.
FIN
(結束)- 5.
RST
(重置)、- 6.
URG
(緊急)- 7.
Sequence number
(順序號碼)- 8.
Acknowledge number
(確認號碼)
1.三次握手
- 1.
TCP
協議中建立連接需要經過三次握手,開始時客戶端處于CLOSED
的狀態,服務端處于LISTEN
狀態
- 1.
第一次握手
- 1.客戶端發送
SYN
報文(包
)到服務器并指明客戶端的初始化序列號seq
,此時客戶端處于SYN_SEND
狀態,等待服務器確認- 2.首部的同步位
SYN=1
,初始化序列號sqe=x
,x
是一個隨機生成的值- 2.
第二次握手
- 1.服務器收到客戶端的
SYN
報文,發送一個SYN+ACK
報文作為應答并且指定自己的初始化序列號- 2.將客戶端的初始化序列號加一,即
x + 1
作為ack
的值,表示已經收到了客戶端的SYN
報文,此時服務器處于SYN_REVD
的狀態- 3.確認報文段中
SYN=1
,ACK=1
,確認號ack=x+1
,初始化序列號seq=y
- 3.
第三次握手
- 1.客戶端收到服務器
SYN+ACK
報文后,會向服務器發送一個ACK
報文表示已經收到了服務端的報文- 2.此時客戶端處于
ESTABLISHED
狀態,服務器收到ACK
報文之后,也處于ESTABLISHED
狀態,此時雙方已建立起了連接,完成三次握手- 3.確認報文段中
ACK=1
,確認號ack=y+1
,初始化序列號seq=x+1
- 2.三次握手(
Three-way Handshake
)本質:指建立一個TCP
連接時需要客戶端和服務器總共發送3
個包- 3.三次握手的作用:確認雙方的接收能力和發送能力是否正常,指定自己的初始化序列號為后面的可靠性傳送做準備,實質上是連接服務器指定端口建立
TCP
連接并同步連接雙方的序列號和確認號,交換TCP
窗口大小信息- 4.理想狀態下
TCP
連接一旦建立,則在通信雙方中的任何一方主動關閉連接之前TCP
連接都將被一直保持下去- 5.一般握手過程中傳送的包里不包含數據,三次握手完成后客戶端與服務器才正式開始傳送數據
- 6.注意
- 1.
SYN=1
報文段不能攜帶數據,ACK
報文段可以攜帶數據,不攜帶數據則不消耗序號,即三次握手的前兩次不能攜帶數據,而第三次可以攜帶數據- 2.
ACK
和ack
的區別
- 1.三次握手發送的數據包中有兩個
ACK
,習慣通過一個大寫一個小寫加以區分- 2.
ACK
:確認標志(Acknowledgement
),值為1
表示確認連接- 3.
ack
:確認編號(Acknowledgement Number
),值為發送方
傳來的seq+1
,表示已經成功接收上一次所有數據- 3.需要三次握手的原因
- 1.第一次握手:客戶端發送網絡包,服務端接收;結論:
服務端可知客戶端的發送能力正常
- 2.第二次握手:服務端發送網絡包,客戶端接收;結論:
客戶端可知服務端的接收,發送能力正常
,但是此時服務端并不能確認客戶端的接收能力正常所以需要第三次的確認- 3.第三次握手:客戶端發送網絡包,服務端接收;結論:
服務端可知客戶端的接收,發送能力正常
- 4.兩次握手的問題
- 1.客戶端發出連接請求但因連接請求報文丟失而未收到確認,于是客戶端再重傳一次連接請求
- 2.服務端后來收到了確認,建立了連接,數據傳輸完畢后,就釋放了連接
- 3.客戶端共發出了兩個連接請求報文段,其中第一個丟失,第二個到達了服務端,但是第一個丟失的報文段只是在某些網絡結點長時間滯留,從而延誤到連接釋放以后的某個時間才到達服務端
- 4.此時服務端誤認為客戶端又發出一次新的連接請求,于是就向客戶端發出確認報文段,同意建立連接
- 5.不采用三次握手,只要服務端發出確認就建立新的連接,此時客戶端忽略服務端發來的確認也不發送數據,則服務端一致等待客戶端發送數據,浪費資源
- 5.半連接隊列和全連接隊列
- 1.服務器第一次接收到客戶端的
SYN
報文后會處于SYN_RCVD
狀態,此時雙方還沒有完全建立其連接,服務器會把此種狀態下請求連接放在一個隊列里,把這種隊列稱之為半連接隊列- 2.全連接隊列:已經完成三次握手建立起連接的會放在全連接隊列中,如果隊列滿了有可能會出現丟包現象
- 3.服務器發送完
SYN+ACK
包后如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除,且每次重傳等待的時間不一定相同,一般會是指數增長
1.初始化序列號ISN
- 1.客戶端和服務端在建立
TCP
連接時,雙方都會發送SYN
報文并初始化序列號(Initial Sequence Number
,ISN
)- 2.使用相同
ISN
導致的問題
- 1.假設
A
和B
使用固定的序號,A
使用序號1
和B
建立TCP
連接,發送一個SYN
報文,此時seq = 1
,經過三次握手后A
和B
之間建立TCP
連接完成- 2.當
A
和B
建立TCP
連接后,A
又使用相同的序號1
向B
發送了200
字節數據,不過因為網絡擁塞問題,這個TCP
數據報一直在網絡中逗留并沒有立即到達B
- 3.由于
A
發送的TCP
數據報一直沒到達B
,正好此時A發生故障并重啟,于是B
就釋放這條TCP
連接,然后A
重啟后又使用序號1
和B
建立新的TCP
連接- 4.當
TCP
連接建立后A
又使用序號1
向B
發送了240
字節的數據,不過這次網絡很穩定B
馬上就收到A
發送的數據,注意此時A
發送數據使用新的TCP
連接- 5.
A
之前發送的TCP
數據報經過一段時間后終于到達B
,不過該TCP
數據報屬于之前已經釋放的舊TCP
連接,B
應該把這個數據報丟棄掉,但是由于A
每次發送報文都使用了相同的序號(seq = 1
)從而會讓B
誤認為該數據報屬于新建立的TCP
連接,因此B
會對該數據照收不誤導致B
在收到新TCP
連接的數據后又收到舊TCP
連接的數據從而出現數據亂序的問題- 3.
ISN
的作用:保證消息的順序性
- 1.由于
A
和B
之間的一個TCP
連接通常是由A
和B
的2
個ip
地址,2
個端口號構成的四元組- 2.因此當
A
出現了故障把該TCP
連接斷開之后再以相同的四元組建立新的TCP
連接(A
和B
兩次建立TCP
連接都是使用相同的ip
地址和端口),就會出現數據亂序的問題- 3.因為只要
A
發送了一個TCP
報文段且這個TCP
報文段的四元組和序號和之前的TCP
連接(四元組和序號)相同的話就會被B
確認- 4.這反映了
TCP
的一些缺點,如果被一些惡意攻擊者加以利用TCP
的這種缺點,選擇合適的序號,ip
地址和端口就能偽造出一個TCP
報文段從而打斷正常的TCP
連接- 5.但是初始化序號的方式(通過算法來隨機生成序號)就會使序號難以猜出,也就不容易利用這種缺點來進行一些惡意攻擊行為,且如何序號不同那么
B
在接收到這個序號為1
的TCP
報文時,發現該TCP
報文的序號不在新TCP
連接的接收范圍內時會把這個TCP
報文丟棄掉從而避免了數據亂序的問題
2.四次揮手
- 1.
TCP
協議中斷開連接需要經過四次揮手,開始時客戶端和服務端都處于ESTABLISHED
狀態,假定客戶端先發起關閉請求
- 1.
第一次揮手