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/IP 建立连接、断开连接的过程

TCP/IP 建立连接、断开连接的过程  以下内容来自:http://www.cnblogs.com/rootq/articles/1377355.html TCP协议三次握手过程分析 T...
  • qfikh
  • qfikh
  • 2016年09月22日 11:11
  • 4613

TCP/IP编程之accept函数详解

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

在socket编程中,如何获取连接另一端(客户端)的ip地址,使用accept或者getpeername

//这段代码没有实际的功能,只是为了获取连接另一端的ip地址 #include #include #include #pragma comment(lib, "wsock32") u...
  • gukesdo
  • gukesdo
  • 2011年10月20日 09:27
  • 24018

tcp连接中的listen()与accept()

int listen(int sockfd, int backlog); 作用:通知服务端准备接受套结字上的连接请求。>364页原话. 感觉说的很浅,具体是怎么准备的呢? 先说结论:  ...

tcp的半连接攻击和全连接攻击--TCP_DEFER_ACCEPT

半连接攻击是一种针对协议栈的攻击,或者说是一中针对主机的攻击,皮之不存毛将焉附,主机一旦被攻击而耗尽了内存资源,用户态的应用程序也将无法运行。TCP半连接攻击可以通过syn cookie机制或者syn...
  • sz_liao
  • sz_liao
  • 2013年03月11日 11:59
  • 601

tcp的半连接攻击和全连接攻击--TCP_DEFER_ACCEPT

转载:http://blog.csdn.net/dog250/article/details/5955094 半连接攻击是一种针对协议栈的攻击,或者说是一中针对主机的攻击,皮之不存毛将焉附,...

tcp的半连接攻击和全连接攻击--TCP_DEFER_ACCEPT

转自http://blog.csdn.net/dog250/article/details/5955094
  • Kiritow
  • Kiritow
  • 2016年05月04日 14:44
  • 837

TCP/IP协议详解(二):建立和关闭连接

作者: remcarpediem 联系方式:segmentfault,csdn,简书 本文转载请注明作者、文章来源,链接,版权归作者所有。  看了酷壳网站上的《TCP 的那些事儿》系列文章,有一...

剖析TCP/IP协议建立和释放连接的三次握手与四次挥手过程

最近在与X公司进行http api联调时积累了一些关于tcp/ip协议建立和释放连接的三次与四次挥手的详细过程,顺便也回顾一下tcp/ip协议方面的知识。本文首先介绍tcp/ip包结构和tcpdump...
  • yown
  • yown
  • 2016年12月31日 23:22
  • 602
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP/IP (一) accept建立连接
举报原因:
原因补充:

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