c++tcp接收文件缓存多大合适_必知必会的TCP/IP知识
點擊上方「藍(lán)字」關(guān)注我們
1
TCP/IP模型?
TCP/IP協(xié)議模型(Transmission Control Protocol/Internet Protocol),包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議,是Internet的核心協(xié)議。
TCP/IP協(xié)議族按照層次由上到下,層層包裝。最上面的是應(yīng)用層,這里面有http,ftp等我們熟悉的協(xié)議。而第二層則是傳輸層,TCP和UDP協(xié)議就在這個層次。第三層是網(wǎng)絡(luò)層,IP協(xié)議就在這里,它負(fù)責(zé)對數(shù)據(jù)加上IP地址和其他的數(shù)據(jù)以確定傳輸?shù)哪繕?biāo)。第四層是網(wǎng)絡(luò)接口層(數(shù)據(jù)鏈路層),這個層次為待傳送的數(shù)據(jù)加入一個以太網(wǎng)協(xié)議頭,并進(jìn)行CRC編碼,為最后的數(shù)據(jù)傳輸做準(zhǔn)備。
2
網(wǎng)絡(luò)接口層?
物理層負(fù)責(zé)0、1 bit流與物理設(shè)備電壓高低、光的閃滅之間的互換。數(shù)據(jù)鏈路層負(fù)責(zé)將0、1序列劃分為數(shù)據(jù)幀從一個節(jié)點傳輸?shù)脚R近的另一個節(jié)點,這些節(jié)點是通過MAC來唯一標(biāo)識的(MAC,物理地址,一個主機(jī)會有一個MAC地址)。
封裝成幀: 把網(wǎng)絡(luò)層數(shù)據(jù)報加頭和尾,封裝成幀,幀頭中包括源MAC地址和目的MAC地址。
透明傳輸: 0bit填充轉(zhuǎn)義字符。
可靠傳輸: 在出錯率很低的鏈路上很少用,但是無線鏈路WLAN會保證可靠傳輸。
差錯檢測(CRC):接收者檢測錯誤,如果發(fā)現(xiàn)差錯,丟棄該幀。
3
網(wǎng)絡(luò)層?
1.?IP協(xié)議
IP協(xié)議是TCP/IP協(xié)議的核心,所有的TCP,UDP,IMCP,IGMP的數(shù)據(jù)都以IP數(shù)據(jù)格式傳輸。要注意的是,IP不是可靠的協(xié)議,這是說,IP協(xié)議沒有提供一種數(shù)據(jù)未傳達(dá)以后的處理機(jī)制,這被認(rèn)為是上層協(xié)議:TCP或UDP要做的事情。
在數(shù)據(jù)鏈路層中我們一般通過MAC地址來識別不同的節(jié)點,而在IP層(網(wǎng)絡(luò)層)我們也要有一個類似的地址標(biāo)識,這就是IP地址。
32位IP地址分為網(wǎng)絡(luò)位和地址位,這樣做可以減少路由器中路由表記錄的數(shù)目,有了網(wǎng)絡(luò)地址,就可以限定擁有相同網(wǎng)絡(luò)地址的終端都在同一個范圍內(nèi),那么路由表只需要維護(hù)一條這個網(wǎng)絡(luò)地址的方向,就可以找到相應(yīng)的這些終端了。
A類IP地址:0.0.0.0~127.0.0.0B類IP地址:128.0.0.1~191.255.0.0C類IP地址:192.168.0.0~239.255.255.02.ARP及RARP協(xié)議
ARP 是根據(jù)IP地址獲取MAC地址的一種協(xié)議。
ARP(地址解析)協(xié)議是一種解析協(xié)議,本來主機(jī)是完全不知道這個IP對應(yīng)的是哪個主機(jī)的哪個接口,當(dāng)主機(jī)要發(fā)送一個IP包的時候,會首先查一下自己的ARP高速緩存(就是一個IP-MAC地址對應(yīng)表緩存)。
如果查詢的IP-MAC值對不存在,那么主機(jī)就向網(wǎng)絡(luò)發(fā)送一個ARP協(xié)議廣播包,這個廣播包里面就有待查詢的IP地址,而直接收到這份廣播的包的所有主機(jī)都會查詢自己的IP地址,如果收到廣播包的某一個主機(jī)發(fā)現(xiàn)自己符合條件,那么就準(zhǔn)備好一個包含自己的MAC地址的ARP包傳送給發(fā)送ARP廣播的主機(jī)。
而廣播主機(jī)拿到ARP包后會更新自己的ARP緩存(就是存放IP-MAC對應(yīng)表的地方)。發(fā)送廣播的主機(jī)就會用新的ARP緩存數(shù)據(jù)準(zhǔn)備好數(shù)據(jù)鏈路層的的數(shù)據(jù)包發(fā)送工作。
RARP協(xié)議的工作與此相反,不做贅述。
3. ICMP協(xié)議
IP協(xié)議并不是一個可靠的協(xié)議,它不保證數(shù)據(jù)被送達(dá),那么,自然的,保證數(shù)據(jù)送達(dá)的工作應(yīng)該由其他的模塊來完成。其中一個重要的模塊就是ICMP(網(wǎng)絡(luò)控制報文)協(xié)議。ICMP不是高層協(xié)議,而是IP層的協(xié)議。
當(dāng)傳送IP數(shù)據(jù)包發(fā)生錯誤。比如主機(jī)不可達(dá),路由不可達(dá)等等,ICMP協(xié)議將會把錯誤信息封包,然后傳送回給主機(jī)。給主機(jī)一個處理錯誤的機(jī)會,這 也就是為什么說建立在IP層以上的協(xié)議是可能做到安全的原因。
4
ping?
ping可以說是ICMP的最著名的應(yīng)用,是TCP/IP協(xié)議的一部分。利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通,可以很好地幫助我們分析和判定網(wǎng)絡(luò)故障。
ping利用ICMP協(xié)議包來偵測另一個主機(jī)是否可達(dá)。原理是用類型碼為0的ICMP發(fā)請求,收到請求的主機(jī)則用類型碼為8的ICMP回應(yīng)。
ping程序用來計算間隔時間,并計算有多少個包被送達(dá)。用戶就可以判斷網(wǎng)絡(luò)大致的情況。我們可以看到, ping給出來了傳送的時間和TTL的數(shù)據(jù)。
5
TCP/UDP?
TCP/UDP都是是傳輸層協(xié)議,但是兩者具有不同的特性,同時也具有不同的應(yīng)用場景。
1. UDP(面向報文)
面向報文的傳輸方式是應(yīng)用層交給UDP多長的報文,UDP就照樣發(fā)送,即一次發(fā)送一個報文。因此,應(yīng)用程序必須選擇合適大小的報文。若報文太長,則IP層需要分片,降低效率。若太短,會是IP太小。
2. TCP(面向字節(jié)流)
面向字節(jié)流的話,雖然應(yīng)用程序和TCP的交互是一次一個數(shù)據(jù)塊(大小不等),但TCP把應(yīng)用程序看成是一連串的無結(jié)構(gòu)的字節(jié)流。TCP有一個緩沖,當(dāng)應(yīng)用程序傳送的數(shù)據(jù)塊太長,TCP就可以把它劃分短一些再傳送。
6
TCP連接的建立和終止?
1.?三次握手
TCP是面向連接的,無論哪一方向另一方發(fā)送數(shù)據(jù)之前,都必須先在雙方之間建立一條連接。在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),連接是通過三次握手進(jìn)行初始化的。三次握手的目的是同步連接雙方的序列號和確認(rèn)號并交換 TCP窗口大小信息。
第一次握手:?建立連接。客戶端發(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三次握手。
2.四次揮手
當(dāng)客戶端和服務(wù)器通過三次握手建立了TCP連接以后,當(dāng)數(shù)據(jù)傳送完畢,肯定是要斷開TCP連接的啊。那對于TCP的斷開連接,這里就有了神秘的“四次分手”。
第一次分手:?主機(jī)1(可以是客戶端,也可以是服務(wù)器端),設(shè)置Sequence 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)閉連接了。
7
TCP流量控制?
如果發(fā)送方把數(shù)據(jù)發(fā)送得過快,接收方可能會來不及接收,這就會造成數(shù)據(jù)的丟失。所謂流量控制就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。
利用滑動窗口機(jī)制可以很方便地在TCP連接上實現(xiàn)對發(fā)送方的流量控制。
當(dāng)發(fā)送方收到接受窗口 win = 0 時,這時發(fā)送方停止發(fā)送報文,并且同時開啟一個定時器,每隔一段時間就發(fā)個測試報文去詢問接收方,打聽是否可以繼續(xù)發(fā)送數(shù)據(jù)了,如果可以,接收方就告訴他此時接受窗口的大小;如果接受窗口大小還是為0,則發(fā)送方再次刷新啟動定時器。
免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除
end
往期推薦
Linux常用開源庫
Linux系統(tǒng)之內(nèi)核模塊編程
Linux信號及工作原理
長按識別圖中二維碼關(guān)注
我就知道你在看!總結(jié)
以上是生活随笔為你收集整理的c++tcp接收文件缓存多大合适_必知必会的TCP/IP知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: es 查询语法_ES 在数据量很大的情况
- 下一篇: python中使用函数的优点_Pytho