TCP和UDP

序言
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,基于連接的協(xié)議,也就是說在收發(fā)數(shù)據(jù)前,需要建立可靠的連接。
UDP 是User Datagram Protocol的簡稱, 中文名是用戶數(shù)據(jù)報協(xié)議, 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。

一、編程區(qū)別

通常我們在說到網(wǎng)絡(luò)編程時默認(rèn)是指TCP編程,即用前面提到的socket函數(shù)創(chuàng)建一個socket用于TCP通訊,函數(shù)參數(shù)我們通常填為SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示建立一個socket用于流式網(wǎng)絡(luò)通訊。
  SOCK_STREAM這種的特點是面向連接的,即每次收發(fā)數(shù)據(jù)之前必須通過connect建立連接,也是雙向的,即任何一方都可以收發(fā)數(shù)據(jù),協(xié)議本身提供了一些保障機(jī)制保證它是可靠的、有序的,即每個包按照發(fā)送的順序到達(dá)接收方。

而SOCK_DGRAM這種是User Datagram Protocol協(xié)議的網(wǎng)絡(luò)通訊,它是無連接的,不可靠的,因為通訊雙方發(fā)送數(shù)據(jù)后不知道對方是否已經(jīng)收到數(shù)據(jù),是否正常收到數(shù)據(jù)。任何一方建立一個socket以后就可以用sendto發(fā)送數(shù)據(jù),也可以用recvfrom接收數(shù)據(jù)。根本不關(guān)心對方是否存在,是否發(fā)送了數(shù)據(jù)。它的特點是通訊速度比較快。大家都知道TCP是要經(jīng)過三次握手的,而UDP沒有。

基于上述不同,UDP和TCP編程步驟也有些不同,如下:

TCP:
TCP編程的服務(wù)器端一般步驟是:
  1、創(chuàng)建一個socket,用函數(shù)socket();
  2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選
  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
  4、開啟監(jiān)聽,用函數(shù)listen();
  5、接收客戶端上來的連接,用函數(shù)accept();
  6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
  7、關(guān)閉網(wǎng)絡(luò)連接;
  8、關(guān)閉監(jiān)聽;

TCP編程的客戶端一般步驟是:
  1、創(chuàng)建一個socket,用函數(shù)socket();
  2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
  4、設(shè)置要連接的對方的IP地址和端口等屬性;
  5、連接服務(wù)器,用函數(shù)connect();
  6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
  7、關(guān)閉網(wǎng)絡(luò)連接;

UDP:
與之對應(yīng)的UDP編程步驟要簡單許多,分別如下:
  UDP編程的服務(wù)器端一般步驟是:
  1、創(chuàng)建一個socket,用函數(shù)socket();
  2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
  4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();
  5、關(guān)閉網(wǎng)絡(luò)連接;

UDP編程的客戶端一般步驟是:
  1、創(chuàng)建一個socket,用函數(shù)socket();
  2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
  4、設(shè)置對方的IP地址和端口等屬性;
  5、發(fā)送數(shù)據(jù),用函數(shù)sendto();
  6、關(guān)閉網(wǎng)絡(luò)連接;
二、應(yīng)用場景

UDP應(yīng)用場景:
1.面向數(shù)據(jù)報方式
2.網(wǎng)絡(luò)數(shù)據(jù)大多為短消息
3.擁有大量Client
4.對數(shù)據(jù)安全性無特殊要求
5.網(wǎng)絡(luò)負(fù)擔(dān)非常重,但對響應(yīng)速度要求高

三、TCP鏈接的三次握手--四次分手

TCP是面向連接的,無論哪一方向另一方發(fā)送數(shù)據(jù)之前,都必須先在雙方之間建立一條連接。在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),連接是通過三次握手進(jìn)行初始化的。三次握手的目的是同步連接雙方的序列號和確認(rèn)號并交換 TCP窗口大小信息。這就是面試中經(jīng)常會被問到的TCP三次握手。只是了解TCP三次握手的概念,對你獲得一份工作是沒有任何幫助的,你需要去了解TCP三次握手中的一些細(xì)節(jié)。先來看圖說話。


jellythinkTCP4.jpeg
第一次握手:建立連接。客戶端發(fā)送連接請求報文段,將SYN位置為1,Sequence Number為x;然后,客戶端進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器的確認(rèn);
第二次握手:服務(wù)器收到SYN報文段。服務(wù)器收到客戶端的SYN報文段,需要對這個SYN報文段進(jìn)行確認(rèn),設(shè)置Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要發(fā)送SYN請求信息,將SYN位置為1,Sequence Number為y;服務(wù)器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一并發(fā)送給客戶端,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK報文段。然后將Acknowledgment Number設(shè)置為y+1,向服務(wù)器發(fā)送ACK報文段,這個報文段發(fā)送完畢以后,客戶端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài),完成TCP三次握手。

完成了三次握手,客戶端和服務(wù)器端就可以開始傳送數(shù)據(jù)。以上就是TCP三次握手的總體介紹。

第一次分手:主機(jī)1(可以使客戶端,也可以是服務(wù)器端),設(shè)置Sequence Number和Acknowledgment Number,向主機(jī)2發(fā)送一個FIN報文段;此時,主機(jī)1進(jìn)入FIN_WAIT_1狀態(tài);這表示主機(jī)1沒有數(shù)據(jù)要發(fā)送給主機(jī)2了;
第二次分手:主機(jī)2收到了主機(jī)1發(fā)送的FIN報文段,向主機(jī)1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機(jī)1進(jìn)入FIN_WAIT_2狀態(tài);主機(jī)2告訴主機(jī)1,我“同意”你的關(guān)閉請求;
第三次分手:主機(jī)2向主機(jī)1發(fā)送FIN報文段,請求關(guān)閉連接,同時主機(jī)2進(jìn)入LAST_ACK狀態(tài);
第四次分手:主機(jī)1收到主機(jī)2發(fā)送的FIN報文段,向主機(jī)2發(fā)送ACK報文段,然后主機(jī)1進(jìn)入TIME_WAIT狀態(tài);主機(jī)2收到主機(jī)1的ACK報文段以后,就關(guān)閉連接;此時,主機(jī)1等待2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,主機(jī)1也可以關(guān)閉連接了。

至此,TCP的四次分手就這么愉快的完成了。當(dāng)你看到這里,你的腦子里會有很多的疑問,很多的不懂,感覺很凌亂;沒事,我們繼續(xù)總結(jié)。

提問:為什么要三次握手?
TCP的三次握手,那為什么非要三次呢?怎么覺得兩次就可以完成了。那TCP為什么非要進(jìn)行三次連接呢?

為了防止已失效的連接請求報文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯誤

為什么要四次分手?

那四次分手又是為何呢?TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的運輸層通信協(xié)議。TCP是全雙工模式,這就意味著,當(dāng)主機(jī)1發(fā)出FIN報文段時,只是表示主機(jī)1已經(jīng)沒有數(shù)據(jù)要發(fā)送了,主機(jī)1告訴主機(jī)2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了;但是,這個時候主機(jī)1還是可以接受來自主機(jī)2的數(shù)據(jù);當(dāng)主機(jī)2返回ACK報文段時,表示它已經(jīng)知道主機(jī)1沒有數(shù)據(jù)發(fā)送了,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的;當(dāng)主機(jī)2也發(fā)送了FIN報文段時,這個時候就表示主機(jī)2也沒有數(shù)據(jù)要發(fā)送了,就會告訴主機(jī)1,我也沒有數(shù)據(jù)要發(fā)送了,之后彼此就會愉快的中斷這次TCP連接。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態(tài)變化。

四、總結(jié)TCP與UDP區(qū)別總結(jié):
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2、TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保 證可靠交付
3、TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報文的
UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實時應(yīng)用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內(nèi)容

  • 1 運輸層協(xié)議概述 1.1 進(jìn)程之間的通信 網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信,而運輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯...
    Mr希靈閱讀 8,147評論 0 34
  • TCP和UDP的區(qū)別與聯(lián)系 1,TCP為傳輸控制層協(xié)議,為面向連接的,可靠的,點到點的通信。2,UDP為用戶數(shù)據(jù)報...
    陪你看日出去閱讀 315評論 0 2
  • 網(wǎng)絡(luò)協(xié)議 TCP和UDP的區(qū)別于聯(lián)系 TCP為傳輸控制層協(xié)議,為面向連接、可靠的、點到點的通信; UDP為用戶數(shù)據(jù)...
    iOS暮光閱讀 915評論 0 0
  • 你家孩子厭食?不愛吃飯?每頓吃飯都讓你發(fā)愁? 那是因為身為媽媽的你不愛動手,更不愛動腦的原因,問題絕對不是出在孩子...
    西瓜甜甜啦閱讀 454評論 21 21
  • 人最害怕的就是只感動了自己。 愛上一個人,節(jié)衣縮食只為攢錢給他買一樣心愛的東西,不知他是否歡喜卻暗自告訴自己,我為...
    墨涵Cynthia閱讀 565評論 0 0