一.TCP協議
在很多情況下,它只是利用 IP 進行通信時所必須用到的協議群的統稱,TCP/IP 為網際協議群或者互聯網的協議,具體來說,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都屬于 TCP/IP 協議,
TCP 是以太網協議和 IP 協議的上層協議,也是應用層協議的下層協議,
以太網協議解決了局域網的點對點通信,但是,以太網協議不能解決多個局域網如何互通,這由 IP 協議解決,IP 協議只是一個地址協議,并不保證資料包的完整,如果路由器丟包(比如快取滿了,新進來的資料包就會丟失),就需要發現丟了哪一個包,以及如何重新發送這個包,這就要依靠 TCP 協議,
詳見:五分鐘讀懂TCP 協議——TCP協議簡介_Bigstar的博客-CSDN博客_tcp協議
簡單說,TCP 協議的作用是,保證資料通信的完整性和可靠性,防止丟包,
TCP 協議為了做到效率與可靠性的統一,設計了一個慢啟動(slow start)機制,開始的時候,發送得較慢,然后根據丟包的情況,調整速率:如果不丟包,就加快發送速度;如果丟包,就降低發送速度,
Linux 內核里面設定了(常量TCP_INIT_CWND),剛開始通信的時候,發送方一次性發送10個資料包,即發送視窗”的大小為10,然后停下來,等待接收方的確認,再繼續發送,默認情況下,接收方每收到兩個 TCP 資料包,就要發送一個確認訊息,”確認”的英語是 acknowledgement,所以這個確認訊息就簡稱 ACK,
ACK 攜帶兩個資訊:
1.期待要收到下一個資料包的編號
2.接收方的接收視窗的剩余容量123
發送方有了這兩個資訊,再加上自己已經發出的資料包的最新編號,就會推測出接收方大概的接收速度,從而降低或增加發送速率,這被稱為發送視窗,這個視窗的大小是可變的,


總結TCP服務端撰寫步驟,如下:
- 呼叫socket函式創建套接字,
- 呼叫bind函式給創建的套接字命名,分配IP地址和埠,
- 呼叫listen函式進行監聽,等待客戶端連接,
- 呼叫accept函式接受新的連接,做好相互通信準備,
二.埠號
資料鏈路和 IP 中的地址,分別指的是 MAC 地址和 IP 地址,
前者用來識別同一鏈路中不同的計算機,后者用來識別 TCP/IP 網路中互連的主機和路由器,埠號用來識別同一臺計算機中進行通信的不同應用程式,因此,它也被稱為程式地址,
傳輸層協議正是利用這些埠號識別本機中正在進行通信的應用程式,并準確地將資料傳輸,埠號由其使用的傳輸層協議決定,因此,不同的傳輸層協議可以使用相同的埠號,
在UDP/IP協議中,用源IP地址 + 源埠號 + 目的IP地址 + 目的埠號 + 協議號(組成的套接字),這樣一個五元組來標識一個通信(通過netstat -n 查看)
1.從網路層來說,通信的是兩個主機(兩個局域網),IP資料報的首部明確標志了這兩臺主機的IP地址,真正需要通信的是兩臺主機上的行程,
2.從運輸層來看,通信的真正端點并不是主機而是“主機的行程”,
傳輸層和網路層的明顯區別是:網路層為主機之間提供邏輯通信,而運輸層提供端到端的邏輯通信,
ip地址是用來標志服務器的,但是一個服務器上會有很多個程式同時使用網路,那怎么保證他們的網路包不串線?埠號就入場了,它是0-65535之間的一個數字,服務端是監聽一個固定的埠,這樣客戶端在連接的時候都知道該連哪個應用,

詳見:什么是埠號?_l477918269的博客-CSDN博客_埠號是什么
三.TCP的三次握手
TCP將若干個位元組構成一個分組,叫報文段(Segment),TCP報文段封裝在IP資料報中,資料可在同一時間雙向傳輸,
TCP建立連接的程序稱為三次握手
1.PC1發送SYN報文(Seq=x,SYN=1)
2.PC2發送SYN+ACK報文(Seq=y,Ack=x+1,SYN=1, ACK=1)
3.PC1發送ACK報文(Seq=x+1,Ack=y+1,ACK=1)

在三次握手的時間軸中,不同的時間,接收方和發送方有不同的狀態:
1.在接收方沒有接收到資料之前,它一直處于監聽狀態(Listen)
2.發送方在第一個報文發送出去,到接收到第一個報文的回應之間,屬于同步已發送狀態(SYNC- SENT),表示已經將SYN發送出去了,并且等待對方的SYN資訊
3.第二次握手完成后,發送方就進入建立連接(ESTABLISHED)的狀態了
4.接收方只有在接收到發送方的ACK報文后(第三次握手完成后),才能進入建立連接(ESTABLISHED)的狀態
詳見:
1.https://blog.csdn.net/qq_43613793/article/details/120181519
2.通俗易懂理解TCP協議三次握手和四次揮手及其常見問題_impact_factor的博客-CSDN博客_tcp三次握手
四.TCP的四次揮手
1.PC1發送FIN/ACK(FIN=1,ACK=1)
2.PC2發送ACK報文(ACK=1)
3.PC2發送FIN/ACK(FIN=1,ACK=1)
4.PC1發送ACK報文(ACK=1)

A.發送FIN資料包,代表A不在發送資料
B:收到請求,開始應答,避免了A重新發送FIN重試**(應答機制)**
B:處理完資料之后關閉,關閉連接以發送FIN請求
A:收到請求后發送ACK應答,B服務可以釋放連接
等待2MSL以后釋放連接的原因:
1.防止報文丟失,導致B重復發送FIN,
2.防止滯留在網路中的報文,對新建立的連接造成資料擾亂,
五.具體2MSL
1.四次揮手釋放連接時,等待2MSL的意義?
(MSL可譯為“最長報文段壽命”,它是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄,)
兩個理由:
1)保證客戶端發送的最后一個ACK報文段能夠到達服務端,
為了保證客戶端發送的最后一個ACK報文段能夠到達服務器,因為這個ACK有可能丟失,從而導致處在LAST-ACK狀態的服務器收不到對FIN-ACK的確認報文,服務器會超時重傳,這個FIN-ACK,接著客戶端再重傳一次確認,重新啟動時間等待計時器,最后客戶端和服務器都能正常的關閉,假設客戶端不等待2MSL,而是在發送完ACK之后直接釋放關閉,一但這個ACK丟失的話,服務器就無法正常的進入關閉連接狀態,
2)防止“已失效的連接請求報文段”出現在本連接中,
客戶端在發送完最后一個ACK報文段后,再經過2MSL,就可以使本連接持續的時間內所產生的所有報文段都從網路中消失,使下一個新的連接中不會出現這種舊的連接請求報文段,
2.為什么TIME_WAIT狀態需要經過2MSL才能回傳到CLOSE狀態?
理論上,四個報文都發送完畢就可以直接進入CLOSE狀態,但是可能網路是不可靠的,有可能最后一個ACK丟失所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文
詳見:https://blog.csdn.net/str_lyc/article/details/109543525
六.資料可靠性傳輸
TCP主要提供了檢驗和、序列號/確認應答、超時重傳、最大訊息長度、滑動視窗控制,擁塞控制等方法實作了可靠性傳輸,

七.重傳機制
常見的重傳機制:1)超時重傳 2)快速重傳 3)SACK 4)D-SACK
而所有重傳的機制都需要依賴通過序列號Seq與確認應答ACK,在 TCP 中,當發送端的資料到達接收主機時,接收端主機會回傳一個確認應答訊息,表示已收到訊息,
四種重傳機制此處不多贅述,


這兩種都效率低下,所以有滑動視窗協議與累計確認(延時ack),滑動視窗大小同通過TCP三次握手和對端協商,但是受網路狀況的影響,
此博客僅作為個人學習筆記,侵刪嗚嗚(′???)σ
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/300210.html
標籤:其他
上一篇:liunx開啟Nginx失敗, 出現 An error occurred
下一篇:微服務001創建專案
