ÌØ±ðÊÇÔÚ´¦ÀíTCP/IPÁ¬½Óʱ£¬LinuxÄÚºËÌṩÁËһϵÁиßЧ¶ø¾«Ï¸µÄ¿ØÖÆ»úÖÆ£¬ÆäÖС°accept¡±º¯ÊýÔÚ·þÎñÆ÷¶ËÌ×½Ó×Ö±à³ÌÖаçÑÝ×ÅÖÁ¹ØÖØÒªµÄ½ÇÉ«
±¾ÎÄÖ¼ÔÚÉîÈë̽ÌÖLinux»·¾³Ï£¬ÌرðÊÇÔÚÉæ¼°¡°accept IP¡±Ïà¹Ø²Ù×÷ʱ£¬ÈçºÎÓÐЧÀûÓÃÏµÍ³ÌØÐÔ£¬ÓÅ»¯ÍøÂçÐÔÄÜ£¬È·±£¸ßЧ¡¢°²È«µÄÍøÂçÁ¬½Ó
Ò»¡¢Àí½âTCPÁ¬½ÓµÄÈý´ÎÎÕÊÖÓëacceptº¯Êý ÔÚTCP/IPÐÒéÕ»ÖУ¬½¨Á¢Á¬½ÓµÄ¹ý³Ì×ñÑÈý´ÎÎÕÊÖÔÔò£º¿Í»§¶ËÊ×ÏÈ·¢ËÍÒ»¸öSYN°ü£¨Í¬²½ÐòÁбàºÅÇëÇ󣩣¬·þÎñÆ÷ÊÕµ½ºó»Ø¸´Ò»¸öSYN-ACK°ü£¨Í¬²½ÐòÁбàºÅÈ·Èϼ°×ÔÉíͬ²½ÐòÁбàºÅÇëÇ󣩣¬×îºó¿Í»§¶ËÔÙ·¢ËÍÒ»¸öACK°ü£¨È·ÈÏ£©Íê³ÉÁ¬½Ó½¨Á¢
ÔÚÕâ¸ö¹ý³ÌÖ®ºó£¬·þÎñÆ÷¶Ë¾Í¿ÉÒÔͨ¹ý`accept`º¯Êý½ÓÊÜÕâ¸öÁ¬½ÓÁË
`accept`º¯ÊýµÄ×÷ÓÃÊÇ´ÓÒÑÍê³ÉÁ¬½ÓµÄ¼àÌý¶ÓÁÐÖÐÈ¡³öÏÂÒ»¸öÒÑÍê³ÉÁ¬½ÓÇëÇ󣬲¢·µ»ØÒ»¸öеÄÌ×½Ó×ÖÃèÊö·û£¬¸ÃÃèÊö·ûÓÃÓÚÓë¿Í»§¶Ë½øÐкóÐøµÄ¶Áд²Ù×÷
ÖµµÃ×¢ÒâµÄÊÇ£¬`accept`º¯ÊýÊÇ×èÈûµÄ£¬¼´Èç¹ûûÓпÉÓõÄÁ¬½ÓÇëÇó£¬Ëü»áÒ»Ö±µÈ´ýÖ±µ½ÓÐÁ¬½Ó±»½¨Á¢
include
¶þ¡¢LinuxÄÚºËÖеÄAccept»úÖÆÓëÓÅ»¯
LinuxÄں˶Ô`accept`º¯Êý½øÐÐÁËÉî¶ÈÓÅ»¯£¬ÒÔÓ¦¶Ô¸ß²¢·¢³¡¾°ÏµÄÐÔÄÜÌôÕ½ ÒÔÏÂÊÇһЩ¹Ø¼ü»úÖÆºÍ¼¼Êõ£º
1.¼àÌý¶ÓÁйÜÀí£ºLinuxͨ¹ýÁ½¸ö¶ÓÁÐÀ´¹ÜÀíTCPÁ¬½ÓÇëÇ󡪡ª°ëÁ¬½Ó¶ÓÁкÍÈ«Á¬½Ó¶ÓÁÐ °ëÁ¬½Ó¶ÓÁд洢ÄÇЩÒÑÍê³ÉµÚÒ»´ÎÎÕÊÖµ«ÉÐδÍê³ÉµÚ¶þ´ÎÎÕÊÖµÄÁ¬½ÓÇëÇ󣬶øÈ«Á¬½Ó¶ÓÁÐÔò´æ´¢ÒÑÍê³ÉÈý´ÎÎÕÊÖ¡¢µÈ´ý`accept`º¯Êý´¦ÀíµÄÁ¬½Ó Äں˲ÎÊý`tcp_max_syn_backlog`ºÍ`somaxconn`·Ö±ð¿ØÖÆÕâÁ½¸ö¶ÓÁеĴóС£¬ºÏÀíÅäÖÃÕâЩ²ÎÊý¶ÔÓÚÌáÉý·þÎñÆ÷ÐÔÄÜÖÁ¹ØÖØÒª
2.¿ìËÙ»ØÊÕ»úÖÆ£ºÎªÁ˱ÜÃâ×ÊԴй¶£¬LinuxÄÚºËʵÏÖÁË¿ìËÙ»ØÊÕ»úÖÆ£¬µ±`accept`º¯Êý´¦ÀíÍêÒ»¸öÁ¬½Óºó£¬»áÁ¢¼´½«¶ÔÓ¦µÄ×ÊÔ´ÊÍ·Å»ØÏµÍ³£¬¹©ºóÐøÁ¬½ÓʹÓÃ
3.TCP_DEFER_ACCEPTÑ¡ÏÕâÊÇÒ»¸ö¸ß¼¶Ñ¡ÏÔÊÐí¿ª·¢ÕßÉèÖ÷þÎñÆ÷ÔÚÊÕµ½ÍêÕûµÄTCPÁ¬½ÓÇëÇó֮ǰ£¬ÑÓ³Ùµ÷ÓÃ`accept`º¯Êý Õâ¶ÔÓÚ¼õÉÙ¶Ìʱ¼äÄÚµÄÁ¬½Ó²¨¶¯¡¢Ìá¸ßϵͳÎȶ¨ÐԷdz£ÓаïÖú
4.¶à¶ÓÁд¦Àí£ºÏÖ´úLinuxÄÚºËÖ§³Ö¶à¶ÓÁд¦Àí¼¼Êõ£¬Èç`epoll`¡¢`kqueue`µÈ£¬ËüÃÇÌṩÁ˱ȴ«Í³`select`¡¢`poll`¸ü¸ßЧµÄʼþ֪ͨ»úÖÆ£¬Äܹ»ÏÔÖøÌáÉý¸ß²¢·¢³¡¾°ÏµÄÐÔÄÜ
Èý¡¢ÊµÏÖ¸ßЧAccept IP²ßÂÔ
ÔÚʵ¼ÊÓ¦ÓÃÖУ¬½ö½öÒÀÀµÄں˵ÄĬÈÏÉèÖÃÍùÍùÎÞ·¨Âú×ãÌØ¶¨Ó¦Óó¡¾°µÄÐèÇó Òò´Ë£¬¿ª·¢ÕßÐèÒª¸ù¾Ýʵ¼ÊÇé¿ö£¬²ÉȡһϵÁвßÂÔÀ´ÓÅ»¯`accept IP`Ïà¹ØµÄ²Ù×÷£º
1.ºÏÀíÅäÖüàÌý¶ÓÁдóС£º¸ù¾Ý·þÎñÆ÷µÄ´¦ÀíÄÜÁ¦ºÍÔ¤ÆÚµÄ²¢·¢Á¬½ÓÊý£¬µ÷Õû`tcp_max_syn_backlog`ºÍ`somaxconn`µÄÖµ ¹ý¸ßµÄÖµ¿ÉÄÜ»áÀË·Ñϵͳ×ÊÔ´£¬¶ø¹ýµÍÔò¿ÉÄܵ¼ÖÂÁ¬½Ó±»¾Ü¾ø
2.ʹÓ÷Ç×èÈûI/OÓëʼþÇý¶¯Ä£ÐÍ£º½áºÏepoll»ò`select`µÈ»úÖÆ£¬ÊµÏÖ·Ç×èÈûI/O£¬±ÜÃâµ¥¸ö`accept`µ÷ÓÃ×èÈûÕû¸ö·þÎñÆ÷½ø³Ì ÕâÒªÇ󿪷¢ÕßÔÚ±à³ÌÄ£ÐÍÉϽøÐе÷Õû£¬²ÉÓÃʼþÇý¶¯µÄ·½Ê½´¦ÀíÁ¬½ÓÇëÇó
3.ÀûÓÃTCP_DEFER_ACCEPT£º¶ÔÓÚÐèÒªÑÓ³Ù½ÓÊÜÁ¬½ÓµÄ³¡¾°£¬ÈçWeb·þÎñÆ÷ÔÚ½ÓÊÕµ½ÍêÕûµÄHTTPÇëÇóͷ֮ǰ£¬¿ÉÒÔ¿¼ÂÇʹÓÃ`TCP_DEFER_ACCEPT`Ñ¡ÏÒÔ¼õÉÙ²»±ØÒªµÄ×ÊÔ´ÏûºÄ
4.IP¹ýÂËÓë¶àÍø¿¨ÓÅ»¯£ºÔÚ¶àÍø¿¨»·¾³Ï£¬Í¨¹ýÅäÖ÷ÓɹæÔòºÍ·À»ðǽ¹æÔò£¬È·±£`accept`º¯ÊýÖ»½ÓÊÜÀ´×ÔÌØ¶¨IPµØÖ·»òÍø¶ÎµÄÁ¬½ÓÇëÇó£¬Ìá¸ß°²È«ÐÔºÍЧÂÊ Í¬Ê±£¬ÀûÓÃLinuxµÄÍøÂçÃüÃû¿Õ¼ä£¨Network Namespaces£©¹¦ÄÜ£¬ÊµÏÖ¸üϸÁ£¶ÈµÄÍøÂç¸ôÀëºÍ¹ÜÀí
5.ÐÔÄÜ¼à¿ØÓëµ÷ÓÅ£ºÊ¹Óù¤¾ßÈçnetstat¡¢ss¡¢`tcpdump`µÈ£¬¼à¿ØÍøÂçÁ¬½Ó״̬£¬·ÖÎöÐÔÄÜÆ¿¾± ¸ù¾Ý¼à¿Ø½á¹û£¬²»¶Ïµ÷Õû¼àÌý¶ÓÁдóС¡¢ÓÅ»¯ÍøÂçÅäÖã¬ÉõÖÁ¿¼ÂÇÓ²¼þÉý¼¶
ËÄ¡¢°¸Àý·ÖÎöÓëʵս¼¼ÇÉ
ÒÔÒ»¸ö¼òµ¥µÄHTTP·þÎñÆ÷ΪÀý£¬Õ¹Ê¾ÈçºÎͨ¹ýÉÏÊö²ßÂÔÓÅ»¯`accept IP`²Ù×÷ ¼ÙÉè·þÎñÆ÷Ô¤ÆÚ´¦Àí¸ß²¢·¢ÇëÇó£¬ÇÒÏ£Íû½ö½ÓÊÜÀ´×ÔÌØ¶¨×ÓÍø£¨Èç192.168.1.0/24£©µÄÁ¬½Ó
1.ÅäÖüàÌý¶ÓÁУº
bash
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
2.ʹÓÃepollʵÏÖ·Ç×èÈûI/O£º
c
int epoll_fd = epoll_create1(0);
struct epoll_event ev,events¡¾MAX_EVENTS¡¿;
ev.events = EPOLLIN;
ev.data.fd = listen_sockfd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_sockfd, &ev);
while(1) {
int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
for(int i = 0; i < n; ++i){
if(events¡¾i¡¿.data.fd == listen_sockfd) {
structsockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
intclient_sockfd =accept(listen_sockfd,(structsockaddr)&client_addr, &client_len);
// Ìí¼ÓÐÂÁ¬½Óµ½epollʵÀý
}else {
// ´¦ÀíÏÖÓÐÁ¬½ÓµÄÊý¾Ý
}
}
}
3.IP¹ýÂË£º
ÔÚ·À»ðǽ¹æÔòÖÐÌí¼ÓÔÊÐí¹æÔò£º
bash
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
ͨ¹ýÉÏÊö²½Ö裬ÎÒÃǹ¹½¨ÁËÒ»¸öÄܹ»¸ßЧ´¦Àí¸ß²¢·¢Á¬½Ó¡¢ÇÒ¾ßÓлù±¾°²È«ÐÔµÄHTTP·þÎñÆ÷ʾÀý
Îå¡¢½áÓï
LinuxÒÔÆä·á¸»µÄÍøÂç±à³Ì½Ó¿ÚºÍÇ¿´óµÄÄÚºËÓÅ»¯»úÖÆ£¬Îª¿ª·¢ÕßÌṩÁ˹ãÀ«µÄÎę̀ ÉîÈëÀí½â`accept`º¯Êý¼°Æä±³ºóµÄ»úÖÆ£¬½áºÏʵ¼ÊÐèÇó½øÐÐϸÖµÄÅäÖÃÓëÓÅ»¯£¬Êǹ¹½¨¸ßÐÔÄÜÍøÂçÓ¦ÓõĹؼü Ëæ×ż¼ÊõµÄ²»¶Ï½ø²½£¬LinuxÍøÂçÕ»Ò²ÔÚ³ÖÐøÑݽø£¬Î´À´ÎÒÃǽ«¿´µ½¸ü¶à´´ÐµÄÌØÐԺ͹¤¾ß£¬ÖúÁ¦¿ª·¢ÕßÓ¦¶Ô¸ü¼Ó¸´ÔÓ¶à±äµÄÍøÂç»·¾³