TCP/IP (一) accept建立连接

原创 2015年11月17日 20:05:58

七层网络协议、三次握手、四次分手,这些大家都比较熟知,这里主要是带着一些问题来思考整个TCP/IP流程。


1.三次握手的具体流程是怎么样的?

2.socket编程中int listen(int fd, int backlog); backlog的真正意义是什么?

3.一个TCP server能建立多少个本机连接?能建立多少个非本机连接?

4.如何查看服务器的连接状态?


先来回顾一下TCP的三次握手和四次分手


思考一下,服务器的SYN_RECV状态和ESTABLISHED状态存放在哪里,能存放多少个状态,

这里借用陶大师的一个图,


第一次握手:当客户端SYN到达时,如果服务器SYN队列未满,就会插入到SYN队列,如果SYN队列满了,则请求就会被丢弃

第二次握手:服务器SYN+ACK给客户端,表示服务器收到客户端发的请求了

第三次握手:客户端收到服务器是SYN+ACK时,向服务器发起ACK,表示客户端已经准备完毕,此时服务器将连接从SYN队列移到ACCEPT队列,则三次握手才算真正完成。



考虑以下情形:
一、服务器在第三次握手收到客户端ACK时,将连接从SYN队列取出,并准备向ACCEPT队列插入,此时如果ACCEPT队列满了,服务器通过 /proc/sys/net/ipv4/tcp_abort_on_overflow 来决定如何返回,0 表示直接丢丢弃该 ACK,1 表示发送 RST 通知客户端。


二、listen时设置的套接字设为非阻塞模式(默认为阻塞模式),这两种模式会导致accept方法有不同的行为,

阻塞模式下,accept等待的时间不定,由客户端是否发起请求而定,

非阻塞模式下,accept要么返回成功的连接,要么返回失败。


三、如果主进程listen fd,多个子进程同时accept wait,会发生什么,哪个子进程会抢到该连接?有兴趣的可以搜一下惊群效应


四、如果客户端连上服务器,这个时候拔掉客户端网线并重启,该连接就会处于异常状态,如何检测这些异常连接?当客户端再次连上服务器并产生数据交互时,服务器就会发送RST至客户端关闭连接,如果不再有数据交互,则TCP的keepalive能检测到该问题。


五、系统保留端口:1-1023,自由端口:1024-65535,启动的服务器不应该bind 1-1023的端口

一个TCP server能建立多少个本机连接?首先我们要明白,一个TCP连接的组成是两对IP和两个端口,那么本机客户端连本机服务器的连接数最大理论值为65535-1,同时受到进程能打开的最大句柄数限制,可通过ulimit -n查看。


六、服务器bind IP和端口时,IP怎么选?

INADDR_ANY表示接收所有IP的连接,

0.0.0.0表示接收所有IP的连接,

localhost/127.0.0.1表示只接收本地连接,

客户端通过127.0.0.1或者localhost连接本机服务器时,数据流只经过内核,不经过网卡,几乎无性能损失,我们经常配置的nginx upstream大都是如此设置


七、如何在服务器查看TCP的连接数和各种状态?应该把netstat、tcpdump、lsof等命令练习得比较熟悉,

比如查看8080端口的各种状态:netstat -natl | grep 8080 | awk '{print $6}' | sort | uniq -c | sort -nr


八、关于connect超时,可参考文章socket超时设置详解(connect/read/write)


参考资料:《tcp/ip详解卷1》

参考文章:http://blog.csdn.net/russell_tao/article/details/9111769



版权声明:本文为博主原创文章,转载请注明出处。

TCP网络编程中connect()、listen()和accept()三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下:connect()函数对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三次握...
  • tennysonsky
  • tennysonsky
  • 2015年05月10日 18:34
  • 67538

TCP/IP编程之accept函数详解

accept函数由TCP服务器调用,用于从已完成连接队列返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠(假定套接字默为默认的阻塞方式) 函数原型: ACCEPT(2) ...
  • daiyudong2020
  • daiyudong2020
  • 2016年07月09日 22:17
  • 3904

高性能网络编程(一)----accept建立连接

最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。 编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相...
  • russell_tao
  • russell_tao
  • 2013年06月24日 19:02
  • 41011

Linux协议栈accept和syn队列问题

 Linux协议栈accept和syn队列问题 2014-03-19 11:30:06 分类: LINUX 环境:        Client 通过tcp 连接s...
  • xuerongdeng
  • xuerongdeng
  • 2015年05月21日 10:23
  • 1031

TCP全连接队列和半连接队列已满之后的连接建立过程抓包分析

在进行client不断的对server端进行connect的过程中发现下面这个状态,而且循环6w次的链接只进行了2W多次就出错了。 于是去查找了下原因: Linux内核协...
  • Jason_zjj
  • Jason_zjj
  • 2017年01月14日 11:50
  • 1314

TCP accept返回的socket,服务端TCP连接数限制

http://www.cppblog.com/aa19870406/archive/2012/07/15/183595.html socket accept()返回的socket描述符的端口...
  • wwww4
  • wwww4
  • 2015年06月10日 09:42
  • 3152

TCP网络编程中connect()、listen()跟accept()三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务...
  • caomiao2006
  • caomiao2006
  • 2016年05月14日 21:37
  • 952

TCP网络编程中connect()、listen()和accept()三者之间的关系

一、tcp编程的核心步骤
  • lianghe_work
  • lianghe_work
  • 2015年06月10日 16:39
  • 2946

TCP面试题(一)之TCP的三次握手和accept()的顺序

经过腾讯的六次技术面的考验,每次基本必问TCP的一些知识。因此,笔者一直都想总结一下,但由于太忙(懒),一直没有去做,趁这会儿有时间,特在此处总结下,希望对大家有帮助。      众所周知,TCP是面...
  • Vivid_110
  • Vivid_110
  • 2016年03月28日 20:33
  • 3872

linux中TCP的socket、bind、listen、connect和accept的实现

socket:
  • a364572
  • a364572
  • 2014年10月30日 21:35
  • 2236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP/IP (一) accept建立连接
举报原因:
原因补充:

(最多只允许输入30个字)