日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP协议-如何保证传输可靠性

發(fā)布時(shí)間:2023/11/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP协议-如何保证传输可靠性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

TCP協(xié)議傳輸?shù)奶攸c(diǎn)主要就是面向字節(jié)流、傳輸可靠、面向連接。這篇博客,我們就重點(diǎn)討論一下TCP協(xié)議如何確保傳輸?shù)目煽啃缘摹?/p>

確保傳輸可靠性的方式

TCP協(xié)議保證數(shù)據(jù)傳輸可靠性的方式主要有:

  • 校驗(yàn)和
  • 序列號(hào)
  • 確認(rèn)應(yīng)答
  • 超時(shí)重傳
  • 連接管理
  • 流量控制
  • 擁塞控制

校驗(yàn)和

計(jì)算方式:在數(shù)據(jù)傳輸?shù)倪^程中,將發(fā)送的數(shù)據(jù)段都當(dāng)做一個(gè)16位的整數(shù)。將這些整數(shù)加起來。并且前面的進(jìn)位不能丟棄,補(bǔ)在后面,最后取反,得到校驗(yàn)和。?
發(fā)送方:在發(fā)送數(shù)據(jù)之前計(jì)算檢驗(yàn)和,并進(jìn)行校驗(yàn)和的填充。?
接收方:收到數(shù)據(jù)后,對(duì)數(shù)據(jù)以同樣的方式進(jìn)行計(jì)算,求出校驗(yàn)和,與發(fā)送方的進(jìn)行比對(duì)。

注意:如果接收方比對(duì)校驗(yàn)和與發(fā)送方不一致,那么數(shù)據(jù)一定傳輸有誤。但是如果接收方比對(duì)校驗(yàn)和與發(fā)送方一致,數(shù)據(jù)不一定傳輸成功。(校驗(yàn)和保證的是數(shù)據(jù)的正確性,下面介紹的機(jī)制是保證數(shù)據(jù)能夠被成功接收)

確認(rèn)應(yīng)答與序列號(hào)?

序列號(hào):TCP傳輸時(shí)將每個(gè)字節(jié)的數(shù)據(jù)都進(jìn)行了編號(hào),這就是序列號(hào)。?
確認(rèn)應(yīng)答:TCP傳輸?shù)倪^程中,每次接收方收到數(shù)據(jù)后,都會(huì)對(duì)傳輸方進(jìn)行確認(rèn)應(yīng)答。也就是發(fā)送ACK報(bào)文。這個(gè)ACK報(bào)文當(dāng)中帶有對(duì)應(yīng)的確認(rèn)序列號(hào),告訴發(fā)送方,接收到了哪些數(shù)據(jù),下一次的數(shù)據(jù)從哪里發(fā)。

序列號(hào)的作用不僅僅是應(yīng)答的作用,有了序列號(hào)能夠?qū)⒔邮盏降臄?shù)據(jù)根據(jù)序列號(hào)排序,并且去掉重復(fù)序列號(hào)的數(shù)據(jù)。這也是TCP傳輸可靠性的保證之一。

超時(shí)重傳

在進(jìn)行TCP傳輸時(shí),由于確認(rèn)應(yīng)答與序列號(hào)機(jī)制,也就是說發(fā)送方發(fā)送一部分?jǐn)?shù)據(jù)后,都會(huì)等待接收方發(fā)送的ACK報(bào)文,并解析ACK報(bào)文,判斷數(shù)據(jù)是否傳輸成功。如果發(fā)送方發(fā)送完數(shù)據(jù)后,遲遲沒有等到接收方的ACK報(bào)文,這該怎么辦呢?而沒有收到ACK報(bào)文的原因可能是什么呢?

首先,發(fā)送方?jīng)]有接收到響應(yīng)的ACK報(bào)文原因可能有兩點(diǎn):

  • 數(shù)據(jù)在傳輸過程中由于網(wǎng)絡(luò)原因等直接全體丟包,接收方根本沒有接收到。
  • 接收方接收到了響應(yīng)的數(shù)據(jù),但是發(fā)送的ACK報(bào)文響應(yīng)卻由于網(wǎng)絡(luò)原因丟包了。
  • TCP在解決這個(gè)問題的時(shí)候引入了一個(gè)新的機(jī)制,叫做超時(shí)重傳機(jī)制。簡單理解就是發(fā)送方在發(fā)送完數(shù)據(jù)后等待一個(gè)時(shí)間,時(shí)間到達(dá)沒有接收到ACK報(bào)文,那么對(duì)剛才發(fā)送的數(shù)據(jù)進(jìn)行重新發(fā)送。如果是剛才第一個(gè)原因,接收方收到二次重發(fā)的數(shù)據(jù)后,便進(jìn)行ACK應(yīng)答。如果是第二個(gè)原因,接收方發(fā)現(xiàn)接收的數(shù)據(jù)已存在(判斷存在的根據(jù)就是序列號(hào),所以上面說序列號(hào)還有去除重復(fù)數(shù)據(jù)的作用),那么直接丟棄,仍舊發(fā)送ACK應(yīng)答。

    那么發(fā)送方發(fā)送完畢后等待的時(shí)間是多少呢?如果這個(gè)等待的時(shí)間過長,那么會(huì)影響TCP傳輸?shù)恼w效率,如果等待時(shí)間過短,又會(huì)導(dǎo)致頻繁的發(fā)送重復(fù)的包。如何權(quán)衡?

    由于TCP傳輸時(shí)保證能夠在任何環(huán)境下都有一個(gè)高性能的通信,因此這個(gè)最大超時(shí)時(shí)間(也就是等待的時(shí)間)是動(dòng)態(tài)計(jì)算的。
    ?

    在Linux中(BSD Unix和Windows下也是這樣)超時(shí)以500ms為一個(gè)單位進(jìn)行控制,每次判定超時(shí)重發(fā)的超時(shí)時(shí)間 都是500ms的整數(shù)倍。重發(fā)一次后,仍未響應(yīng),那么等待2*500ms的時(shí)間后,再次重傳。等待4*500ms的時(shí)間繼續(xù) 重傳。以一個(gè)指數(shù)的形式增長。累計(jì)到一定的重傳次數(shù),TCP就認(rèn)為網(wǎng)絡(luò)或者對(duì)端出現(xiàn)異常,強(qiáng)制關(guān)閉連接。

    連接管理

    連接管理就是三次握手與四次揮手的過程,在前面詳細(xì)講過這個(gè)過程,這里不再贅述。保證可靠的連接,是保證可靠性的前提。

    流量控制

    接收端在接收到數(shù)據(jù)后,對(duì)其進(jìn)行處理。如果發(fā)送端的發(fā)送速度太快,導(dǎo)致接收端的結(jié)束緩沖區(qū)很快的填充滿了。此時(shí)如果發(fā)送端仍舊發(fā)送數(shù)據(jù),那么接下來發(fā)送的數(shù)據(jù)都會(huì)丟包,繼而導(dǎo)致丟包的一系列連鎖反應(yīng),超時(shí)重傳呀什么的。而TCP根據(jù)接收端對(duì)數(shù)據(jù)的處理能力,決定發(fā)送端的發(fā)送速度,這個(gè)機(jī)制就是流量控制。

    在TCP協(xié)議的報(bào)頭信息當(dāng)中,有一個(gè)16位字段的窗口(接收端反饋窗口)大小。在介紹這個(gè)窗口大小時(shí)我們知道,窗口大小的內(nèi)容實(shí)際上是接收端接收數(shù)據(jù)緩沖區(qū)的剩余大小。這個(gè)數(shù)字越大,證明接收端接收緩沖區(qū)的剩余空間越大,網(wǎng)絡(luò)的吞吐量越大。接收端會(huì)在確認(rèn)應(yīng)答發(fā)送ACK報(bào)文時(shí),將自己的即時(shí)窗口大小填入,并跟隨ACK報(bào)文一起發(fā)送過去。而發(fā)送方根據(jù)ACK報(bào)文里的窗口大小的值的改變進(jìn)而改變自己的發(fā)送速度。如果接收到窗口大小的值為0,那么發(fā)送方將停止發(fā)送數(shù)據(jù)。并定期的向接收端發(fā)送窗口探測數(shù)據(jù)段,讓接收端把窗口大小告訴發(fā)送端。?

    注:16位的窗口大小最大能表示65535個(gè)字節(jié)(64K),但是TCP的窗口大小最大并不是64K。在TCP首部中40個(gè)字節(jié)的選項(xiàng)中還包含了一個(gè)窗口擴(kuò)大因子M,實(shí)際的窗口大小就是16為窗口字段的值左移M位。每移一位,擴(kuò)大兩倍。

    擁塞控制

    TCP傳輸?shù)倪^程中,發(fā)送端開始發(fā)送數(shù)據(jù)的時(shí)候,如果剛開始就發(fā)送大量的數(shù)據(jù),那么就可能造成一些問題。網(wǎng)絡(luò)可能在開始的時(shí)候就很擁堵,如果給網(wǎng)絡(luò)中在扔出大量數(shù)據(jù),那么這個(gè)擁堵就會(huì)加劇。擁堵的加劇就會(huì)產(chǎn)生大量的丟包,就對(duì)大量的超時(shí)重傳,嚴(yán)重影響傳輸。

    所以TCP引入了慢啟動(dòng)的機(jī)制,在開始發(fā)送數(shù)據(jù)時(shí),先發(fā)送少量的數(shù)據(jù)探路。探清當(dāng)前的網(wǎng)絡(luò)狀態(tài)如何,再?zèng)Q定多大的速度進(jìn)行傳輸。這時(shí)候就引入一個(gè)叫做擁塞窗口的概念。發(fā)送剛開始定義擁塞窗口為 1,每次收到ACK應(yīng)答,擁塞窗口加 1(加一位翻一倍)。在發(fā)送數(shù)據(jù)之前,首先將擁塞窗口與接收端反饋的窗口大小比對(duì),取較小的值作為實(shí)際發(fā)送的窗口。

    擁塞窗口的增長是指數(shù)級(jí)別的。慢啟動(dòng)的機(jī)制只是說明在開始的時(shí)候發(fā)送的少,發(fā)送的慢,但是增長的速度是非常快的。為了控制擁塞窗口的增長,不能使擁塞窗口單純的加倍,設(shè)置一個(gè)擁塞窗口的閾值,當(dāng)擁塞窗口大小超過閾值時(shí),不能再按照指數(shù)來增長,而是線性的增長。在慢啟動(dòng)開始的時(shí)候,慢啟動(dòng)的閾值等于窗口的最大值,一旦造成網(wǎng)絡(luò)擁塞,發(fā)生超時(shí)重傳時(shí),慢啟動(dòng)的閾值會(huì)為原來的一半(這里的原來指的是發(fā)生網(wǎng)絡(luò)擁塞時(shí)擁塞窗口的大小),同時(shí)擁塞窗口重置為 1。?

    擁塞控制是TCP在傳輸時(shí)盡可能快的將數(shù)據(jù)傳輸,并且避免擁塞造成的一系列問題。是可靠性的保證,同時(shí)也是維護(hù)了傳輸?shù)母咝浴?/p>

    原文地址:https://blog.csdn.net/liuchenxia8/article/details/80428157

    總結(jié)

    以上是生活随笔為你收集整理的TCP协议-如何保证传输可靠性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。