TCP三次握手、四次挥手以及TIME_WAIT详解
前提概述
TCP网络编程中常用的api函数有:
socket、bind、listen、accept、recv、send、close、connect
其中socket函数返回一个文件描述符fd,这个fd并不单纯,而是对应着内核创建的TCB(transport control block),可以理解为一个下标索引,而不同TCB则是根据不同的五元组(源ip、源port、目的ip、目的port、协议类型)来进行区分。
bind函数则是将socket函数创建的fd和本机ip联系起来。
listen的功能是通知协议进程准备接收socketfd 上的连接请求,套接字也将从CLOSED转换到LISTEN状态,它同时也指定socket上可以排队等待的连接数的门限值。超过门限值时,socket将拒绝进入的连接请求排队等待。当这种情况出现时,TCP将忽略进入的连接请求,进程可以通过调用accept来得到队列中的连接。
三次握手过程
在服务端调用listen函数进行监听时,客户端就可以准备通信了,而在通信之前自然离不开一些准备工作了,也就是常说的三次握手。
当客户端调用connect函数时,三次握手也随之发生,如图:
1、客户端首先会发送一个SYN分节(SYN位置位),它将告诉服务器客户端将在连接中发送的数据初始序列号,通常该数据包只有包头。
当服务端收到客户端的第一个SYN分节数据包时,服务端将为本次连接建立对应的TCB并存入一个所谓的半连接队列当中,此时半连接队列中的套接字都将处于SYN_RCVD状态。
2、服务器必须确认客户端发送的SYN,置位SYN和ACK位。如图:
客户端在收到服务器的确认之后,connect将返回0,即建立连接成功。
3、客户端最后再对服务器发送的SYN进行确认,如图:
当服务器收到来自客户端的确认时,处于半连接队列中的套接字将被移到已完成连接队列的队尾,当进程调用accept时,将从已完成连接队列中的队头项返回给进程。此外,listen函数中的第二个参数backlog在一些系统中规定为两个队列之和的最大值,而在有些系统中则是已完成连接队列和的最大值。当队列已满时,服务端将会忽略客户端发送的SYN分节。
此时已连接队列中的套接字都将处于ESTABLISHED状态,即双方连接建立。
三次握手过程中的问题
为什么需要三次握手?
三次握手其实是为了建立双方之间的通信,即双方都要确认通信状态,而不是单向的通信。如果变成两次握手,那么服务器不能确认客户端的接收状态,此外,服务器发送的ACK数据包若丢失,客户端将拒绝后续的数据,则服务器一直在发送,而客户端一直再拒绝。
四次挥手
挥手过程可以理解为一对情侣的分手场景,如图:
结合三次握手过程,我们能很快清楚四次挥手的过程,继续情侣分手的场景,当一方提出分手时,另一方会做出回应,当然后续会有一些争执或者收拾彼此的东西,然后另一方觉得确实没办法继续在一起了,于是也说出了分手,此时当初提出分手的一方会很干脆的进行确认,此后两方再无瓜葛。
四次挥手过程中的问题
1、两端可能同时close吗,此时什么场景?
2、主动方出现大量的TIME_WAIT?TIME_WAIT作用?
这种情况一般发生在高并发短连接的场景,一般可以通过设置reuseaddr的方法来解决。
TIME_WAIT状态作用:
主动关闭放发送最后一个ack包后,可能出现丢失(这时对方还会重发FIN,收到两个FIN的时间间隔一定小于2MSL),使对方没有收到最后一个ACK包时有时间可以重发ACK包;
防止前一个连接中老的分组在新连接中再现,TIME_WAIT存在时间为2MSL,而某个连接上的分组最多存活1MSL就会被丢弃。
3、出现大量的CLOSE_WAIT状态?
被动方处于在收到FIN分节时,处于CLOSE_WAIT,接着就需要进行程序收尾工作,一旦耗时操作比较多,对应的CLOSE_WAIT时间就越长。此时需要调整代码逻辑,即时的调用close函数。
4、出现大量的FIN_WAIT1/2状态?
此时对端没有即时发送ACK,而主动方也没有其他办法过渡到TIME_WAIT状态,只能选择kill掉进程。
5、socket描述符和对应的TCB控制块回收的时间点?
调用close函数后fd被立即回收;
而TCB的话,被动方在接收到ack后被回收,主动方则在TIME_WAIT时间到之后再进行回收。
技术参考:
TCP三次握手、四次挥手以及TIME_WAIT详解相关推荐
- TCP三次握手四次挥手及time_wait状态解析
TCP的建立--三次握手 1.服务器必须准备好接受外来的连接.通常通过调用socket,bind,listen这三个函数来完成,我们称之为被动打开(passive open). 2. 客户端通过调用c ...
- java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手
感谢牛客网网友提供的面试经验! 1. 解释一下TCP三次握手四次挥手 图片来源于微信公众号:码农求职小助手 答: 嗯(稍作思考)- 三次握手简单来说,在数据传输开始前: 第一次握手:客户端向服务端发送 ...
- [计算机网络][总结][常见问题][TCP][三次握手][四次挥手]
TCP三次握手 四次挥手 三次握手 目的:保证传输的可靠性,为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误.主要防止资源的浪费. 具体过程:当客户端发出第一个连接请求报文段时并没有丢 ...
- TCP三次握手四次挥手(图解)
<TCP-IP协议栈概略图与TCP三次握手四次挥手> 目录 1 TCP过程详解 1.1 三次握手 1.2 四次挥手 2 使用tcpdump分析三次握手的过程 2.1 tcpdump抓包和t ...
- TCP三次握手四次挥手过程及其中的状态量
网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...
- java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)
文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...
- TCP三次握手四次挥手简介
TCP三次握手四次挥手简介 图解三次握手.四次挥手 建立连接:三次握手 关闭连接:四次挥手 上图传递过程中出现的几个字符(SYN,ACK,FIN,seq,ack)各代表什么意思 SYN,ACK,FIN ...
- TCP三次握手四次挥手详解
TCP三次握手四次挥手 1. TCP报文格式 2. TCP连接需要解决的问题 3. 三次握手 4. 四次挥手 5. 一些补充问题 1. TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内 ...
- TCP四次挥手 2MSL TIME_WAIT详解
TCP四次挥手 & 2MSL & TIME_WAIT详解 TCP四次挥手流程 各状态解析 2MSL(2倍最大报文段生成时间) 2MSL (Maximum Segment Lifetim ...
- TCP三次握手四次挥手 TCP/UDP区别
三次握手 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: SYN:同步序列编号(Synchronize Sequence Numbe ...
最新文章
- python 对象拷贝
- 网站开发流程以及HTML5简介(三)
- 市电会引起UPS产生故障吗
- Visifire中图表的导出
- 毫米波雷达数据处理_毫米波雷达开启4D时代,助力几何伙伴抢滩自动驾驶量产...
- 使用nginx cache缓存网站数据实践
- 我的2020年终总结:新的角色,新的开始
- 列出薪金高于在部门30_我如何在五个月内将薪金提高一倍并获得一份了不起的工作...
- 源码编译安装gcc-5.3.0
- android finish后不能ondestroy_Android面试基础(一)
- ubuntu之解决挂载NTFS磁盘时出现input/output error
- python 插入查找
- 网易云会员音乐NCM格式在线转为MP3格式
- android 万能视频播放器源码,Android万能视频播放器05-音视频同步
- Java毕业设计-疫情防控系统
- 3d相机机器视觉检测技术
- 图解Navicat连接、操作数据库
- ESR-CMDS参数含义
- 平面设计自学能学会吗?学习平面设需要学多久?
- matlab中tgn,TGN/EE介导的囊泡运输与GDI1协同调控根毛中ROP2 GTPase的动态定位的机理研究...
热门文章
- mvcnn代码详解_Tensorflow,OpenCV实现的CNN车牌识别代码
- python中readtext_Python入门 8——数据的读取与写入
- 【linux】循序渐进学运维-基础篇-yum管理
- OpenGL学习——计算机图形学作业:简单的室内场景
- VTK和ITK中的坐标系统
- Python爬虫笔记——多线程(threading)传参
- 基于Matlab实现 CAMShift算法 进行人脸检测和跟踪
- 区块链行业黑马锐角云高胜利受邀参加深圳国际创客(康客)交流论坛
- 计算机二级java考试内容,2015年计算机二级java考试内容
- require()循环引用问题