关于高性能网络编程的一些知识
?
TCP層為了可靠性,還額外需要解決3個大問題:丟包(網絡分組在傳輸中存在的丟失)、重復(協議層異常引發的多個相同網絡分組)、延遲(很久后網絡分組才到達目的地)。另外,是不是還有順序。
涉及到滑動窗口和擁塞控制。重要的一點:TCP協議是保證了整體網絡的性能的最優化。而不是本身端對端兩點網絡性能的最優化。
?
http://blog.csdn.net/russell_tao/article/details/9111769
?
本文講述的網絡編程頭前冠以“高性能”,它是指程序員設計編寫的服務器需要處理很大的吞吐量,這與簡單網絡應用就有了質的不同。因為:1、高吞吐量下,容易觸發到一些設計上的邊界條件;2、偶然性的小概率事件,會在高吞吐量下變成必然性事件。3、IO是慢速的,高吞吐量通常意味著高并發,如同一時刻存在數以萬計、十萬計、百萬計的TCP活動連接。所以,做高性能網絡編程不能僅僅滿足于學會開源組件、中間件是如何幫我實現期望功能的,對于企業級產品來說,需要了解更多的知識。
?
我認為編寫高性能服務器的關注點有3個: 1、如果基于通用組件編程,關注點多是在組件如何封裝套接字編程細節。 2、通用組件只是在封裝套接字,操作系統是通過提供套接字來為進程提供網絡通訊能力的。 3、網絡的復雜性會影響到服務器的吞吐量,而且,高吞吐量場景下,多種臨界條件會導致應用程序的不正常,特別是組件中有bug或考慮不周或沒有配置正確時。了解網絡分組可以定位出這些問題,可以正確的配置系統、組件,可以正確的理解系統的瓶頸。?
原因在于:首先,SYN隊列和ACCEPT隊列都不是無限長度的,它們的長度限制與調用listen監聽某個地址端口時傳遞的backlog參數有關。
?
所以,如TOMCAT等服務器會使用獨立的線程,只做accept獲取連接這一件事,以防止不能及時的去accept獲取連接。
?
那么,為什么如Nginx等一些服務器,在一個線程內做accept的同時,還會做其他IO等操作呢?
?
這里就帶出阻塞和非阻塞的概念。注:我的理解,一方面nginx后續處理都是異步的,所以很快能再次accept;另外nginx的accept應該也是設置成了nonblocking.
我剛給看了下之前的文章,對于listenfd也是可以設成 非阻塞的。
?
int setnonblocking(int fd) {
? int old_option = fcntl(fd, F_GETFL);
? int new_option = old_option | O_NONBLOCK;
? fcntl(fd, F_SETFL, new_option);
? return old_option;
}
?
?
另外,SO_REUSEADDR也是一個很重要的選項。
?
?
int flag = 1, len = sizeof(int);
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1) {
? perror(“socket”);
}
轉載于:https://www.cnblogs.com/charlesblc/p/6495684.html
總結
以上是生活随笔為你收集整理的关于高性能网络编程的一些知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Raspberry Pi用户指南》——
- 下一篇: 图像灰度化(C语言实现)