Java随笔记 - TCP通信的基本过程,三次握手,四次挥手

基本过程

  • TCP的通信过程与打电话的过程大致相同。一方负责接听某个特定号码的电话,而另一方则需要需要拨通这个号码,与对方建立通信连接。双方都可以通过听筒(Socket输入流)接受对方的信息,通过话筒(Socket输出流)向对方发送信息,并且在整个过程中信息的接受和发送是同时进行的(双工通信)。

  • 整个通信的过程可以用如下示意图来概括:

  • 在图中左侧(服务端)负责在某个端口上监听连接请求,接收来自客户端的连接请求,处理来自右侧(客户端)的请求,并将处理结果返回给客户端。可以看到,这整个请求和处理流程就是典型的客户端/服务器模型(C/S模型)。

建立连接

  • 打电话时,为了确认通话质量,我们常常这样做:

    • 喂,你好,听得到吗?

    • 喂,你好,听得到。你都听得到我说话吗?

    • 嗯,听得到。

  • TCP建立连接的时候也有类似的过程,俗称三次握手:

    • 1)客户端先向服务端发送SYN包(此时Socket的状态从CLOSED变成SYN-SEND)

    • 2)服务端收到此SYN包后(Socket状态从LISTEN变成SYN-RECV),向客户端发送针对此SYN包的SYN/ACK包,以确认收到了该SYN包

    • 3)客户端收到该SYN/ACK包后(Socket的状态从SYN-SEND变成ESTABLISHED),再向服务端发送针对此SYN/ACK包的ACK包

    • 4)服务端收到此ACK后(Socket状态从SYN-RECV变成ESTABLISHED),至此连接成功建立,双方可以进行数据的收发

  • 简单的示意图:

断开连接

  • 断开连接和建立连接一样非常重要,如果处理不当,不仅可能造成数据传输失败,还可能造成Socket不能正常关闭、资源无法释放等问题。

  • 断开连接需要四次挥手,大致的过程如下:

    *1)客户端向服务器发送FIN数据包,表示想要断开连接。Socket状态从ESTABLISHED变成FIN_WAIT_1

    • 2)服务器收到此FIN数据包后,向客户端发送ACK包,表示准备断开中(需要检查是否可以断开连接)。Socket状态从ESTABLISHED变成CLOSE_WAIT

    • 3)客户端收到服务器返回的ACK包,Socket状态从FIN_WAIT_1变成FIN_WAIT_2,等待服务器发送确认断开连接的数据包

    • 4)服务器在准备完毕后向客户端发送FIN包,确认可以断开连接。其Socket的状态从CLOSE_WAIT变成LAST_ACK, 等待客户端确认

    • 5)客户端收到服务器发来的FIN包后,再向服务器发送ACK包,确认可以断开连接。其Socket状态从FIN_WAIT_2变成TIME_WAIT

    • 6)服务器收到客户端的ACK包后,断开连接,关闭套接字(Socket变成CLOSED状态)

    • 7)客户端在等待一段时间后,才真正的关闭连接,让Socket状态从TIME_WAIT变成CLOSED状态

  • 简单的示意图:

  • 关于客户端的TIME_WAIT状态:

    • 网络问题可能会导致丢包,如果发送方在发送数据包后,收不到对应的ACK包,发送方就会因为无法确认对方是否收到而重发数据包。所以在上述的第5步时,客户端向服务端发送的ACK包有可能因为网络问题发生丢失,从而服务端需要重发对应的FIN包。如果客户端在发送ACK包后就完全关闭了Socket,那么无论服务器重发多少次FIN包,都收不到客户端返回的ACK包。所以,客户端的Socket需要先进入TIME_WAIT状态等待一段时间(报文生存时间的两倍),确认服务器收到这一ACK包(服务器没有重发FIN包)后,才能进入CLOSED状态。

常见追问

  • 为什么需要三次握手?两次行吗?会有什么问题?

  • 同上,为什么需要四次挥手?

  • 为什么最后客户端的TIME_WAIT状态的时间为2MSL?

Java随笔记 - TCP通信的基本过程,三次握手,四次挥手相关推荐

  1. TCP/IP 协议簇 端口 三次握手 四次挥手 11种状态集

    第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是 ...

  2. 什么是TCP协议的三次握手四次挥手

    IP协议.HTTP协议.TCP协议.TCP/IP 协议我们经常遇到,而且初学的时候容易弄混.那么他们之间有什么关系呢?重点内容 ####1.什么是TCP/IP 协议 TCP/IP不是一个协议,而是一个 ...

  3. 深入浅出TCP三次握手四次挥手

    每每想起TCP三次握手这个问题,就会陷入如下的困惑: var forget = ? while(forget) {百度/Google } 而重点在于forget永远等于true,无情的消耗着我这颗只有 ...

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

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

  5. go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...

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

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

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

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

  8. 在深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...

  9. tcp 二次握手时延_一篇搞懂TCP的三次握手 四次挥手

    TCP的三次握手四次挥手,估计大家都听过.但是真的能把每一步说明白的人比较少.我还记得在之前面试的时候被面试官一顿问,然后一脸懵B... 都是大学没好好上课 ,这篇文章就跟大家讲讲到底这三握四挥是在搞 ...

  10. 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    转载地址: https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 如果对网络 ...

最新文章

  1. Vi/Vim查找替换使用方法
  2. 如何创建圆角 UITextField 与内阴影
  3. mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
  4. 42. Element hasChildNodes() 方法
  5. 回顾 2018: 革新的一年
  6. linux内核线程详解,Linux内核线程
  7. oracle裁员原因_导致甲骨文全球性裁员的原因有哪些?
  8. SAP ABAP BAPI_MATERIAL_AVAILABILITY 查询可用库存
  9. python画人物代码_代码绘制一只小猪佩奇---python篇
  10. IOS逆向之汇编基础
  11. pandas取出特定行列数据
  12. 计算机office二级考试手册,二级office助考手册app
  13. sql server 更新表,每天的数据分固定批次设置批次号sql
  14. centos6.5 安装php探针,Centos5.5下安装LAMP完整版
  15. 【Git】将本地代码推到远端某一分支
  16. 两种禁止USB autosuspend的方法
  17. leetcode 优惠活动系统
  18. 集成墙面有什么致命的缺点呢?
  19. 快消小程序分析报告——金典、永璞咖啡
  20. 打开Java之门——一个Java SE小白的学习日志1【极客BOY-米奇】

热门文章

  1. [渝粤教育] 平顶山学院 学前心理学 参考 资料
  2. 学生端伽卡他彻底卸载
  3. Java开发工具-IDEA(更新中...)
  4. WINDOWS10 win+L 锁屏快捷键失效
  5. Git(2)-Git常用的操作和概念
  6. A. Groundhog and 2-Power Representation (递归 高精度) 2020牛客暑期多校训练营(第九场)
  7. 【顺序栈】32 顺序栈ADT模板简单应用算法设计:火车调度
  8. 华为云教程(云备份CBR)
  9. 发展农村数字普惠金融的问题及对策分析
  10. CTF 实验吧 天网管理系统