TCP研究

tcp協議本身是可靠的,并不等于應用程序用tcp發送數據就一定是可靠的.不管是否阻塞,send發送的大小,并不代表對端recv到多少的數據

在阻塞模式下,?send函數的過程是將應用程序請求發送的數據拷貝到發送緩存中發送并得到確認后再返回.但由于發送緩存的存在,表現為:如果發送緩存大小比請求發送的大?小要大,那么send函數立即返回,同時向網絡中發送數據;否則,send向網絡發送緩存中不能容納的那部分數據,并等待對端確認后再返回(接收端只要將?數據收到接收緩存中,就會確認,并不一定要等待應用程序調用recv);以套接字為例,在阻塞模式下,利用TCP協議發送一個報文時,如果低層協議沒有可用空間來存放用戶數據,則應用進程將阻塞等待直到協議有可用的空間

在非阻塞模式下,send函數的過程僅僅是將數據拷貝到協議棧的緩存區而已,如果緩存區可用空間不夠,則盡能力的拷貝,返回成功拷貝的大小;如緩存區可用空間為0,則返回-1,同時設置errno為EAGAIN.


在?實際應用中,如果發送端是非阻塞發送,由于網絡的阻塞或者接收端處理過慢,通常出現的情況是,發送應用程序看起來發送了10k的數據,但是只發送了2k到對端緩存中,還有8k在本機緩存中(未發送或者未得到接收端的確認).那么此時,接收應用程序能夠收到的數據為2k.假如接收應用程序調用recv函數獲?取了1k的數據在處理,在這個瞬間,發生了以下情況之一,雙方表現為:

A.?發送應用程序認為send完了10k數據,關閉了socket:
發?送主機作為tcp的主動關閉者,連接將處于FIN_WAIT1的半關閉狀態(等待對方的ack),并且,發送緩存中的8k數據并不清除,依然會發送給對?端.如果接收應用程序依然在recv,那么它會收到余下的8k數據(這個前題是,接收端會在發送端FIN_WAIT1狀態超時前收到余下的8k數據.),?然后得到一個對端socket被關閉的消息(recv返回0).這時,應該進行關閉.

B.?發送應用程序再次調用send發送8k的數據:
假?如發送緩存的空間為20k,那么發送緩存可用空間為20-8=12k,大于請求發送的8k,所以send函數將數據做拷貝后,并立即返回8192;

假如發?送緩存的空間為12k,那么此時發送緩存可用空間還有12-8=4k,send()會返回4096,應用程序發現返回的值小于請求發送的大小值后,可以認?為緩存區已滿,這時必須阻塞(或通過select等待下一次socket可寫的信號),如果應用程序不理會,立即再次調用send,那么會得到-1的值,?在linux下表現為errno=EAGAIN.


C.?接收應用程序在處理完1k數據后,關閉了socket:

接?收主機作為主動關閉者,連接將處于FIN_WAIT1的半關閉狀態(等待對方的ack).然后,發送應用程序會收到socket可讀的信號(通常是?select調用返回socket可讀),但在讀取時會發現recv函數返回0,這時應該調用close函數來關閉socket(發送給對方ack);
如?果發送應用程序沒有處理這個可讀的信號,而是在send,那么這要分兩種情況來考慮,假如是在發送端收到RST標志之后調用send,send將返回-1,同時errno設為ECONNRESET表示對端網絡已斷開,但是,也有說法是進程會收到SIGPIPE信號,該信號的默認響應動作是退出進程,如果忽略該信號,那么send是返回-1,errno為EPIPE(未證實);如果是在發送端收到RST標志之前,則send像往常一樣工作;
以上說的是非阻塞的send情況,假如send是阻塞調用,并且正好處于阻塞時(例如一次性發送一個巨大的buf,超出了發送緩存),對端socket關閉,那么send將返回成功發送的字節數,如果再次調用send,那么會同上一樣.

D.?交換機或路由器的網絡斷開:
接收應用程序在處理完已收到的1k數據后,會繼續從緩存區讀取余下的1k數據,然后就表現為無數據可讀的現象,這種情況需要應用程序來處理超時.一般做法是設定一個select等待的最大時間,如果超出這個時間依然沒有數據可讀,則認為socket已不可用.

發送應用程序會不斷的將余下的數據發送到網絡上,但始終得不到確認,所以緩存區的可用空間持續為0,這種情況也需要應用程序來處理.

如果不由應用程序來處理這種情況超時的情況,也可以通過tcp協議本身來處理,具體可以查看sysctl項中的:
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253364.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DDR工作原理

DDR SDRAM全稱為Double Data Rate SDRAM,中文名為“雙倍數據流SDRAM”。DDR SDRAM在原有的SDRAM的基礎上改進而來。也正因為如此,DDR能夠憑借著轉產成本優勢來打敗昔日的對手RDRAM,成為當今的主流。本文只著重講講DDR的原理和DDR SDRAM相對于…

8.1 文件查找local;find使用

文件查找: 在文件系統上查找符合條件的文件。 文件查找:locate, find 非實時查找(數據庫查找):locate實時查找:find locate 1 查詢系統上預建的文件索引數據庫 /var/lib/mlocate/mlocate.db2 依賴于事先構建的索引 索引的構建是在…

hdu 5273 Dylans loves sequence 逆序數 區間dp

點擊打開鏈接 題意&#xff1a;給n個數&#xff0c;q次詢問&#xff0c;&#xff08;L&#xff0c;R&#xff09;區間內的逆序數。 思路&#xff1a; 區間dp 代碼一&#xff1a; 1 #include <bits/stdc.h>2 using namespace std;3 typedef long long ll;4 const int maxn…

python第三天習題

# 1. 文件a.txt內容&#xff1a;每一行內容分別為商品名字&#xff0c;價錢&#xff0c;個數&#xff0c;求出本次購物花費的總錢數# apple 10 3# tesla 100000 1# mac 3000 2# lenovo 30000 3# chicken 10 3## 2. 修改文件內容&#xff0c;把文件中的alex都替換成SB# with ope…

智能故事機方案簡介

智能故事機&#xff0c;又叫WiFi故事機&#xff0c;AI故事機&#xff0c;通過WiFi聯網&#xff0c;用戶語音就可以跟它進行問答、點歌等互動&#xff1b;由于聯網所以可以播放云端海量的兒童音頻內容&#xff1b;手機端在微信公眾號或者專屬APP上操作&#xff0c;可以點播相應內…

使用setsockopt()接口,設置TCP的接收與發送超時,Invalid argument錯誤問題

使用TCP套接字時&#xff0c;當無網絡連接時&#xff0c;還會繼續send&#xff0c;繼續recv阻塞&#xff0c;知道TCP自己協議機制判斷斷開連接時才會停止發送和接收&#xff0c;時間需要幾分鐘之久。解決的辦法是&#xff0c;自己設置接收超時時間&#xff0c;當超時后重新發送…

關于SpringCloud、SpringBoot 希望這是說得最詳細的

幾年前&#xff0c;沒幾個jar沖突一下都不叫搭框架 —— java面試必修 什么是Spring Boot 用我的話來理解&#xff0c;Spring Boot就是整合了框架的框架&#xff0c;它讓一切依賴都變得有序簡單&#xff0c;你不用操心A.jar是什么版本&#xff0c;又依賴哪些版本的jar&#xff…

weui-switch開關控件,表單提交后如何取值

最近在學習weui這個框架&#xff0c;做了一些小的試驗&#xff0c;發現weui-switch控件直接提交不能獲取到表單信息&#xff0c;在segmentfault上發現也有人提了這個問題&#xff0c;有人說可以設置一個隱含標簽來捕獲開關的狀態&#xff0c;試了一下&#xff0c;確實可以&…

麥克風設計指導與選型參考

隨著語音識別技術的成熟&#xff0c;智能音箱類產品的火爆&#xff0c;越來越多的產品可以升級為語音交互產品&#xff1b; 下面簡單介紹下此類產品的語音前端--麥克風陣列設計相關注意事項&#xff1a; 線性四麥陣列構型&#xff1a;如上圖所示&#xff0c;麥克風直線等距擺…

[BZOJ1419] Red is good(期望DP)

傳送門 逆推 只不過順序還是順著的&#xff0c;思想是逆著的 f[i][j]表示還剩下i張紅牌&#xff0c;j張黑牌的期望值 那么邊界是 f[i][0]i&#xff0c;因為只剩i張紅牌 f[0][j]0&#xff0c;只剩黑牌&#xff0c;顯然直接停止最優 f[i][j] max(0,i/(ij)*f[i-1][j]j/(ij)*f[i][…

Linux下高性能網絡編程中的幾個TCP/IP選項_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE

最近在新的平臺上測試程序&#xff0c;以前一些沒有注意到的問題都成為了性能瓶頸&#xff0c;通過設置一些TCP/IP選項能夠解決一部分問題&#xff0c;當然根本的解決方法是重構代碼&#xff0c;重新設計服務器框架。先列出幾個TCP/IP選項&#xff1a; 選項 man 7 socket: SO_R…

云計算在未來一定是不可或缺的

2019獨角獸企業重金招聘Python工程師標準>>> 在2018京東云合作伙伴大會上&#xff0c;京東云總裁申元慶表示&#xff0c;技術發展的大趨勢是“分久必合&#xff0c;合久必分”循環往復的波動&#xff0c;近十年來云計算的發展將算力、存儲、帶寬全部集中在中央部分&…

智能音箱 之 音頻通路質量--測試與參數

一、概述 當將語音識別算法接入到設備時&#xff0c;務必要保證設備的音頻通路具有足夠的質量。因此對設備進行音頻測試&#xff0c;以評估能夠影響語音識別性能的音頻前端的音頻參數。如下要點對語音識別至關重要&#xff1a; 自然聲音合適的增益良好的信噪比一致的響應&…

關于Linux路由表的route命令

轉自&#xff1a;http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 查看 Linux 內核路由表 使用下面的 route 命令可以查看 Linux 內核路由表。 # route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * …

Python學習 - 常用模塊(二)

目錄 一. 常用模塊 - hashlib 二. 常用模塊 - hmac 三. 常用模塊 - logging 四. 常用模塊 - re 五. 常用模塊 - requests 六. 常用模塊 - paramiko 一. 常用模塊 - hashlib hash: 一種算法, 3.x里代替了md5模塊和sha模塊, 主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD5 …

select函數分析

Select在Socket編程中還是比較重要的&#xff0c;可是對于初學Socket的人來說都不太愛用Select寫程序&#xff0c;他們只是習慣寫諸如connect、accept、recv或recvfrom這樣的阻塞程序&#xff08;所謂阻塞方式block&#xff0c;顧名思義&#xff0c;就是進程或是線程執行到這些…

UART介紹

1. 概述 UART, Universal Asynchronous Receiver-Transmitter, 通用異步收發器&#xff1b; 串口&#xff1a;在嵌入式里指的是UART口&#xff0c;常用TTL電平即3.3V或者5.0V&#xff1b; COM口&#xff1a;在臺式機上常用的口&#xff0c;DB9那種接口&#xff0c;接口協議只…

mongodb環境安裝

1、mongodb安裝 我采用的是離線安裝&#xff0c; &#xff08;1&#xff09;在mongodb的官方網址下載所需要的版本。我下載的是 mongodb-linux-x86_64-ubuntu1604-3.4.5.tgz 。 &#xff08;2&#xff09;下載后解壓縮到待安裝目錄&#xff0c;我這里下載在了Downloads目錄…

rabbitmq隊列的exclusive,durability,auto-delete屬性以及消息可靠傳輸設計

非集群下&#xff0c;簡單的說&#xff1a;- 如果是excl&#xff0c;則設置durability沒有意義&#xff0c;因為不管服務器掛了還是客戶端主動/被動斷開了&#xff0c;隊列都會自動刪除。- auto-delete&#xff0c;其實可簡單的認為是同理&#xff0c;即使非excl&#xff0c;則…

IIC 總線接口詳細介紹

1. 概述 IIC Inter Integrated-Circuit 總線是PHLIPS公司推出的一種串行總線&#xff0c;是具備多主機系統所需的包括總線裁決和高低速器件同步功能的高性能串行總線&#xff0c;它支持多主控(multimastering)&#xff0c;其中任何能夠進行發送和接收的設備都可以成為主總線。…