在調試以太網的過程中,考慮了vivado IP配置(管腳、reset等),SDK中PHY芯片的配置(芯片地址、自適應速率配置等),但是,唯獨忽略了tcp/udp協議,所以在ping通之后仍無法連接。
所以現在來學習一下tcp與udp的區別 ---- 為什么要用tcp而不是udp協議。
百度安全驗證https://baijiahao.baidu.com/s?id=1748334531859727810&wfr=spider&for=pc
TCP與UDP(非常詳細)_tcp和udp-CSDN博客?
詳細介紹了tcp的數據格式、流量控制等:
計算機網絡-TCP/UDP詳解(最全)_tcp udp-CSDN博客?
tcp與udp的概念
tcp:
是一種面向有連接的傳輸層協議。適用于要求可靠傳輸的應用。
udp:
是一種面向無連接的傳輸層協議。適用于實時應用(速度快,但可能產生丟包)。
tcp
tcp通信
三次握手、傳輸確認、四次揮手。
三次握手
客戶端 --> 服務端:客戶端想服務端發起連接,會先發一包連接請求數據(SYN包),詢問能否建立連接
服務端 --> 客戶端:服務端收到后,同意連接,就會回復一包SYN+ACK包
客戶端 --> 服務端:客戶端收到后,發送一包ACK包,連接建立
目的:為了防止已失效的請求報文? 突然傳到服務器,引起錯誤(服務端會認為客戶端再次請求連接,但是客戶端并沒有 -- 因為是之前發送的請求)
數據傳輸
一包數據可能會被拆成多包發送。可能會發生:丟包、數據包到達的先后順序不同。
tcp協議為每一個連接建立了發送緩沖區。從建立連接后的第一個字節序列號為0,后面的字節的序列號依次加1。發送數據時,從數據緩沖區取一部分數據組成發送報文,在tcp協議頭中會附帶序列號和長度,接收端在收到數據后需要回復確認報文,確認報文中的ACK等于接收序列號加長度,即下包數據發送的起始序列號。
四次揮手
客戶端/服務端發起關閉連接請求。
客戶端 --> 服務端:客戶端給服務端發起一包FIN包,表示要關閉連接,并且進入終止等待1狀態
服務端 --> 客戶端:服務端收到FIN包,發送一次ACK包,表示自己進入關閉等待狀態,此時客戶端進入終止等待2狀態
此時服務端還可以發送數據,客戶端還可以接收數據。
服務端 --> 客戶端:待服務端發送完數據后,發送一包FIN包,進入確認狀態
客戶端 --> 服務端:客戶端收到FIN包后,回復ACK包,進入超時等待狀態,經過超時時間后關閉連接;服務端收到ACK包后,立即關閉連接
客戶端超時等待狀態的目的:確保發送的ACK包被服務端接收(如果服務端沒有收到,就會一直等待確認,然后會重新發送FIN包,客戶端收到FIN包后會重發ACK包,并刷新超時時間)
Socket
tcp把連接作為最基本的對象,每一條tcp連接都有兩個端點 -- 即套接字(socket),端口號拼接到IP地址即構成了套接字。
udp
udp是非連接的。
發送數據:把數據包封裝一下,從網卡發出。
數據包之間并沒有狀態上的聯系。
優點:速度快,性能損耗少,cpu內存資源占用小于tcp
缺點:可能產生丟包,傳輸穩定性不如tcp
區別
tcp面向連接,udp面向無連接;
tcp是可靠的,udp是不可靠的;
tcp只能一對一,udp支持一對一,也支持一對多,多對多多對一的方式(單播、多播、廣播);
tcp面向字節流,udp面向報文;
tcp會產生粘包問題,udp會產生丟包問題;
...