手表到哪個網(wǎng)站買新網(wǎng)站應該怎么做seo
一、TCP與UDP
TCP/IP協(xié)議族為傳輸層指明了兩個協(xié)議:TCP和UDP,它們都是作為應同程序和網(wǎng)絡操作的中介物。
**TCP(Transmission Control Protocol)協(xié)議全稱是傳輸控制協(xié)議,是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC793定義。**TCP是面向連接的、可靠的流協(xié)議,提供超時重發(fā),丟棄重復數(shù)據(jù),檢驗數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。
TCP傳輸數(shù)據(jù)穩(wěn)定可靠,適用于對網(wǎng)絡通訊質(zhì)量要求較高的場景,需要準確無誤的傳輸給對方,比如,傳輸文件,發(fā)送郵件,瀏覽網(wǎng)頁等等。在傳輸數(shù)據(jù)前,雙方會先建立一條虛擬的通道,可以減少數(shù)據(jù)傳輸差錯。
傳輸流程類似下圖:
**UDP(User Datagram Protocol)協(xié)議全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。**位于OSI模型中第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對數(shù)據(jù)包進行排序的缺點。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務器之間建立一個連接,且沒有超時重發(fā)等機制,故而傳輸速度很快。
UDP的優(yōu)點是速度快,但是可能產(chǎn)生丟包,所以適用于對實時性要求較高但是對少量丟包并沒有太大要求的場景。比如:域名查詢,語音通話,視頻直播等。在數(shù)據(jù)傳輸時,每個數(shù)據(jù)段都是一個獨立的信息,包括完整的源地址和目的地,因此,數(shù)據(jù)能否被對方接收、數(shù)據(jù)到達的實踐和內(nèi)容的完整性有序性都無法得到保證。
傳輸流程類似下圖:
UDP協(xié)議就相當于是寫信給對方,寄出去信件之后不能知道對方是否收到信件,信件內(nèi)容是否完整,也不能得到及時反饋,而TCP協(xié)議就像是打電話,你需要知道對方的號碼才能打電話,交流的內(nèi)容可以實時反饋,確保信息的完整性。
兩者對比:
TCP | UDP |
---|---|
面向連接 | 面向無連接 |
程序結構較簡單 | |
面向字節(jié)流 | 基于數(shù)據(jù)報 |
保證數(shù)據(jù)順序 | 不保證數(shù)據(jù)順序 |
速度很快 | |
可以檢查錯誤與糾正錯誤 | 可以檢查錯誤,不可糾正錯誤 |
總結,UDP更快,更簡單,更高效,因此通常用于發(fā)送音頻和視頻文件。TCP是健壯的,可靠的,并保證以相同的順序傳遞數(shù)據(jù)包。
二、ROS的網(wǎng)絡通訊方式
ROS提供了兩種網(wǎng)絡通訊方式,一種是TCP
協(xié)議,一種是UDP
協(xié)議。默認采用TCP進行通訊,但在實際的wifi網(wǎng)絡使用中經(jīng)常遇到客戶端和機器人連接中斷且無法重新建立連接的情況。在ROS wiki中官方也有說明,ROSTCP
更適合有線網(wǎng)連接的網(wǎng)絡,而ROSUDP
更適合wifi等網(wǎng)絡不可靠的無線網(wǎng)絡。下面介紹一下如何在ROS中使用UDP連接。
首先,rospy不支持udp連接, 所以要實現(xiàn)ROSUDP必須是用roscpp
寫的,然后在訂閱的時候添加 ros::TransportHints
指定連接方式。如下面的代碼:
#include <ros/ros.h>
#include <std_msgs/String.h>void print_message(const std_msgs::String data)
{ROS_INFO_STREAM("received: " << data);
}int main(int argc, char **argv)
{ros::init(argc, argv, "udp_test_node");ros::AsyncSpinner spinner(4);spinner.start();ros::NodeHandle private_nh("~");ros::Subscriber chatter_sub = private_nh.subscribe("/chatter", 10, print_message, ros::TransportHints().unreliable().maxDatagramSize(1000));while (ros::ok()){sleep(1);}
}
其中 unreliable
用于指定采用udp連接。詳細例子可以參照 這個 項目。