connect & send 在三次握手过程中的有趣问题
一、问题回顾
面试的时候被问到的问题,原问题是:
1:写一下socket网络编程服务端和客户端常用的函数。
2:如果服务端在listen之后没有accept,那客户端的connect会返回吗?为什么?
3:此时调用send发数据会怎么样?
在看下面答案之前,推荐阅读:
深入探索 Linux listen() 函数 backlog 的含义
Socket accept queue is full 但是一个连接需要从SYN->ACCEPT
下面是我对这个问题实验整理的结果:
| 情况 | ESTABLISHED 队列没有满 | SYN_RECV队列没有满 | SYN_RECV 队列满了 |
|---|---|---|---|
| connect返回情况 | connect 正常返回 | connect 正常返回 | connect返回timeout错误 |
| send写数据 | 完全正常写,并且数据会被服务器回复ack确认。之后如果accept,可以read出数据。 | 不能正常发送,会不断触发重传,但是数据不会被确认。 | 这时候的socket是完全disconnect的,send给disconnect的socket写数据,触发SIGPIPE信号,默认杀死本进程。 |
二、总结
有关connect函数返回错误的情况,常见的有下面三种:
- 返回
TIMEOUT,即SYN_RECV队列都满了,对于客户端发来的三次握手第一次的SYN都没有办法响应,这时候TCP会隔6s,24s重发,直到75s,如果还是没有被接受,最后返回TIMEOUT错误。 - 返回
ECONNREFUSED错误,表示服务器主机没有在相应的端口开启监听。 - 返回
EHOSTUNREACH或ENETUNREACH,表示在某个中间路由节点返回了ICMP错误,这个错误被内核先保存,之后继续按照6s,24s重发,直到75s,如果还是没有响应,就返回EHOSTUNREACH或ENETUNREACH错误。
我那个问题只涉及了TIMEOUT的情况,没有后两种,另外:
connect什么时候正常返回?其实是客户端收到服务器三次握手第二次返回的
SYN+ACK之后,自己进入了ESTABLISHED状态(TCP状态转换图),这时候connect就会正常返回了。
connect & send 在三次握手过程中的有趣问题的更多相关文章
- TCP三次握手过程中涉及的队列知识的学习
先上一张图 (图片来源:http://www.cnxct.com/something-about-phpfpm-s-backlog/) 如上图所示,这里有两个队列:syns queue(半连接队列): ...
- TCP连接建立的三次握手过程可以携带数据吗?
前几天实验室的群里扔出了这样一个问题:TCP连接建立的三次握手过程可以携带数据吗?突然发现自己还真不清楚这个问题,平日里用tcpdump或者Wireshark抓包时,从来没留意过第三次握手的ACK包有 ...
- TCP的三次握手过程与四次挥手
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...
- 【转】简述TCP的三次握手过程
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...
- Java网络编程学习A轮_02_抓包分析TCP三次握手过程
参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...
- tcp三次握手过程
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...
- TCP协议:三次握手过程详解
本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图. 上图主要包括三部分:建立连接.传输数 ...
- Http协议三次握手过程
Http协议三次握手过程 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...
- 简述TCP的三次握手过程
一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: ...
随机推荐
- 探究java的intern方法
本文主要解释java的intern方法的作用和原理,同时会解释一下经常问的String面试题. 首先先说一下结论,后面会实际操作,验证一下结论.intern方法在不同的Java版本中的实现是不一样的. ...
- Nginx系列(4)- Nginx安装 | Windows
下载 访问官网,选择稳定版对应的Windows系列 安装解压即可 启动nginx 有很多种方法启动nginx 直接双击nginx.exe,双击后一个黑色的弹窗一闪而过 打开cmd命令窗口,切换到ngi ...
- [转载]使用postgresql安装wordpress
1. 环境安装sudo apt-get install apache2sudo apt-get install postgresql-9.1sudo apt-get install php5sudo ...
- 一文彻底掌握Apache Hudi异步Clustering部署
1. 摘要 在之前的一篇博客中,我们介绍了Clustering(聚簇)的表服务来重新组织数据来提供更好的查询性能,而不用降低摄取速度,并且我们已经知道如何部署同步Clustering,本篇博客中,我们 ...
- Dapr + .NET Core实战(八)服务监测
服务监测 分布式服务性能指标,链路追踪,运行状况,日志记录都很重要,我们日常开发中为了实现这些功能需要集成很多功能,替换监控组件时成本也很高. Dapr 可观测性模块将服务监测与应用程序分离.它自动捕 ...
- mysql从零开始之MySQL 管理
MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...
- 极简SpringBoot指南-Chapter02-Spring依赖注入的方式
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- LeetCode352 将数据流变为多个不相交区间
LeetCode352 将数据流变为多个不相交区间 1 题目 给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表. 实现 Summa ...
- redis两种持久化策略/存储模式
redis的持久化策略 RDB,即 Redis DataBase,以快照形式将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的dump文件,达到数据恢复. 默认开启,见redis ...
- fastjson及其反序列化分析--TemplatesImpl
fastjson及其反序列化分析 源码取自 https://www.github.com/ZH3FENG/PoCs-fastjson1241 参考 (23条消息) Json详解以及fastjson使用 ...