Java随笔记 - TCP通信的基本过程,三次握手,四次挥手
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通信的基本过程,三次握手,四次挥手相关推荐
- TCP/IP 协议簇 端口 三次握手 四次挥手 11种状态集
第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是 ...
- 什么是TCP协议的三次握手四次挥手
IP协议.HTTP协议.TCP协议.TCP/IP 协议我们经常遇到,而且初学的时候容易弄混.那么他们之间有什么关系呢?重点内容 ####1.什么是TCP/IP 协议 TCP/IP不是一个协议,而是一个 ...
- 深入浅出TCP三次握手四次挥手
每每想起TCP三次握手这个问题,就会陷入如下的困惑: var forget = ? while(forget) {百度/Google } 而重点在于forget永远等于true,无情的消耗着我这颗只有 ...
- java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)
文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...
- go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)
前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...
- TCP三次握手四次挥手过程及其中的状态量
网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...
- java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手
感谢牛客网网友提供的面试经验! 1. 解释一下TCP三次握手四次挥手 图片来源于微信公众号:码农求职小助手 答: 嗯(稍作思考)- 三次握手简单来说,在数据传输开始前: 第一次握手:客户端向服务端发送 ...
- 在深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP
如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...
- tcp 二次握手时延_一篇搞懂TCP的三次握手 四次挥手
TCP的三次握手四次挥手,估计大家都听过.但是真的能把每一步说明白的人比较少.我还记得在之前面试的时候被面试官一顿问,然后一脸懵B... 都是大学没好好上课 ,这篇文章就跟大家讲讲到底这三握四挥是在搞 ...
- 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP
转载地址: https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 如果对网络 ...
最新文章
- Vi/Vim查找替换使用方法
- 如何创建圆角 UITextField 与内阴影
- mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
- 42. Element hasChildNodes() 方法
- 回顾 2018: 革新的一年
- linux内核线程详解,Linux内核线程
- oracle裁员原因_导致甲骨文全球性裁员的原因有哪些?
- SAP ABAP BAPI_MATERIAL_AVAILABILITY 查询可用库存
- python画人物代码_代码绘制一只小猪佩奇---python篇
- IOS逆向之汇编基础
- pandas取出特定行列数据
- 计算机office二级考试手册,二级office助考手册app
- sql server 更新表,每天的数据分固定批次设置批次号sql
- centos6.5 安装php探针,Centos5.5下安装LAMP完整版
- 【Git】将本地代码推到远端某一分支
- 两种禁止USB autosuspend的方法
- leetcode 优惠活动系统
- 集成墙面有什么致命的缺点呢?
- 快消小程序分析报告——金典、永璞咖啡
- 打开Java之门——一个Java SE小白的学习日志1【极客BOY-米奇】
热门文章
- [渝粤教育] 平顶山学院 学前心理学 参考 资料
- 学生端伽卡他彻底卸载
- Java开发工具-IDEA(更新中...)
- WINDOWS10 win+L 锁屏快捷键失效
- Git(2)-Git常用的操作和概念
- A. Groundhog and 2-Power Representation (递归 高精度) 2020牛客暑期多校训练营(第九场)
- 【顺序栈】32 顺序栈ADT模板简单应用算法设计:火车调度
- 华为云教程(云备份CBR)
- 发展农村数字普惠金融的问题及对策分析
- CTF 实验吧 天网管理系统