TCP 连接详解( 二 )


4、监听 socket 在处理客户端请求时 , 如果此时其他客户端发请求过来 , 监听 socket 是没法处理的 , 此时系统会维护请求队列由 backlog 参数指定;
全连接队列(completed connection queue)
半连接队列(incomplete connection queue)
Linux 内核 2.2 版本之前 , backlog 的大小等于全连接队列和半连接队列之和;
Linux 内核 2.2 版本之后 , backlog 的大小之和全连接队列有关系:
半连接队列大小由
/proc/sys/net/ipv4/tcp_max_syn_backlog 文件指定 , 可以开很大;
全连接队列大小由
/proc/sys/net/core/somaxconn 文件和 backlog 参数指定 , 取两个中的最小值;
Tomcat acceptCount 就是配置全连接队列大小;

TCP 连接详解

文章插图
 
3、socket 函数在建立连接和数据传输的大概使用情况
TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 
 
4、TCP首部结构
TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 
1)2的16次方等于 65536 , 所以系统中端口号的限制个数为 65536 , 一般1024以下端口被系统占用;
2)标志位这里是 6 个 , 还有其他标志位的 , 只是这 6 个标志位常用;
3)seq 序列号 , ack 确认序列号 , 序列号在数据传输时分包用到 。三次握手时 seq 序列号是随机的 , 没有实际意义;
4)TCP 包首部后面接着的是 IP 包首部 , 再紧接着的是以太网包首部 , 其实都是加 0101010101 二进制位;
 
几个常用标志位 , 首先一个标志位占一个 bit 位 , 只能是二进制中的 1 或 0;
1)SYN , 简写 S , 请求标志位 , 用来建立连接 。在TCP三次握手中收到带有该标志位的数据包 , 表示对方想与己方建立连接;
2)ACK , 简写【.】 , 请求确认/应答标志位 , 用于对对方的请求进行应答 , 对方收到含该标志位的数据包 , 会知道己方存在且可用 。也会用在连接建立之后 , 己方发送响应数据给对方的数据包中;
3)FIN , 简写 F , 请求断开标志位 , 用于断开连接 。对方收到己方的含该标志位的数据包 , 就知道己方想与它断开连接 , 不再保持连接;
4)RST , 简写 R , 请求复位标志位 , 因网络或己方服务原因导致有数据包丢失 , 己方接收到的数据包序列号与上一个数据包的序列号不衔接 , 那己方会发送含该标志位的数据包告诉对方 , 对方接收到含该标志位的数据包就知道己方要求它重新三次握手建立连接并重新发送丢失的数据包 , 一般断点续传会用到该标志位;
还有就是如果对方发过来的数据错了 , 有问题 , 己方也会发送含该标志位的数据包;
5)PSH , 简写 P , 推送标志位 , 表示收到数据包后要立即交给应用程序去处理 , 不应该放在缓存中 , read()/write() 都有缓存区;
6)URG , 简写 U , 紧急标志位 , 该标志位表示 tcp 包首部中的紧急指针域有效 , 督促中间层尽快处理;
7)ECE , 在保留位中;
8)CWR , 在保留位中;
 
5、TCP 抓包
TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 

TCP 连接详解

文章插图
 

TCP 连接详解


推荐阅读