前提概述

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详解相关推荐

  1. TCP三次握手四次挥手及time_wait状态解析

    TCP的建立--三次握手 1.服务器必须准备好接受外来的连接.通常通过调用socket,bind,listen这三个函数来完成,我们称之为被动打开(passive open). 2. 客户端通过调用c ...

  2. java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手

    感谢牛客网网友提供的面试经验! 1. 解释一下TCP三次握手四次挥手 图片来源于微信公众号:码农求职小助手 答: 嗯(稍作思考)- 三次握手简单来说,在数据传输开始前: 第一次握手:客户端向服务端发送 ...

  3. [计算机网络][总结][常见问题][TCP][三次握手][四次挥手]

    TCP三次握手 四次挥手 三次握手 目的:保证传输的可靠性,为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误.主要防止资源的浪费. 具体过程:当客户端发出第一个连接请求报文段时并没有丢 ...

  4. TCP三次握手四次挥手(图解)

    <TCP-IP协议栈概略图与TCP三次握手四次挥手> 目录 1 TCP过程详解 1.1 三次握手 1.2 四次挥手 2 使用tcpdump分析三次握手的过程 2.1 tcpdump抓包和t ...

  5. TCP三次握手四次挥手过程及其中的状态量

    网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...

  6. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

  7. TCP三次握手四次挥手简介

    TCP三次握手四次挥手简介 图解三次握手.四次挥手 建立连接:三次握手 关闭连接:四次挥手 上图传递过程中出现的几个字符(SYN,ACK,FIN,seq,ack)各代表什么意思 SYN,ACK,FIN ...

  8. TCP三次握手四次挥手详解

    TCP三次握手四次挥手 1. TCP报文格式 2. TCP连接需要解决的问题 3. 三次握手 4. 四次挥手 5. 一些补充问题 1. TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内 ...

  9. TCP四次挥手 2MSL TIME_WAIT详解

    TCP四次挥手 & 2MSL & TIME_WAIT详解 TCP四次挥手流程 各状态解析 2MSL(2倍最大报文段生成时间) 2MSL (Maximum Segment Lifetim ...

  10. TCP三次握手四次挥手 TCP/UDP区别

    三次握手 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认:  SYN:同步序列编号(Synchronize Sequence Numbe ...

最新文章

  1. python 对象拷贝
  2. 网站开发流程以及HTML5简介(三)
  3. 市电会引起UPS产生故障吗
  4. Visifire中图表的导出
  5. 毫米波雷达数据处理_毫米波雷达开启4D时代,助力几何伙伴抢滩自动驾驶量产...
  6. 使用nginx cache缓存网站数据实践
  7. 我的2020年终总结:新的角色,新的开始
  8. 列出薪金高于在部门30_我如何在五个月内将薪金提高一倍并获得一份了不起的工作...
  9. 源码编译安装gcc-5.3.0
  10. android finish后不能ondestroy_Android面试基础(一)
  11. ubuntu之解决挂载NTFS磁盘时出现input/output error
  12. python 插入查找
  13. 网易云会员音乐NCM格式在线转为MP3格式
  14. android 万能视频播放器源码,Android万能视频播放器05-音视频同步
  15. Java毕业设计-疫情防控系统
  16. 3d相机机器视觉检测技术
  17. 图解Navicat连接、操作数据库
  18. ESR-CMDS参数含义
  19. 平面设计自学能学会吗?学习平面设需要学多久?
  20. matlab中tgn,TGN/EE介导的囊泡运输与GDI1协同调控根毛中ROP2 GTPase的动态定位的机理研究...

热门文章

  1. mvcnn代码详解_Tensorflow,OpenCV实现的CNN车牌识别代码
  2. python中readtext_Python入门 8——数据的读取与写入
  3. 【linux】循序渐进学运维-基础篇-yum管理
  4. OpenGL学习——计算机图形学作业:简单的室内场景
  5. VTK和ITK中的坐标系统
  6. Python爬虫笔记——多线程(threading)传参
  7. 基于Matlab实现 CAMShift算法 进行人脸检测和跟踪
  8. 区块链行业黑马锐角云高胜利受邀参加深圳国际创客(康客)交流论坛
  9. 计算机二级java考试内容,2015年计算机二级java考试内容
  10. require()循环引用问题