简单说说TCP三次握手、四次挥手机制
1.什么是TCP
TCP全称Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
关键信息:
1)面向连接
2)可靠的
3)基于字节流
4)传输层协议
5)端到端
TCP的三次握手和四次挥手是分别发生在建立连接和断开连接的过程中。
2.为什么需要三次握手
前面我们提到说TCP是面向连接的,那么显然通信的双方如果想进行对话(数据交互)首先需要“建立连接”。那么问题来了,如何确认通信双方是否建立连接了呢?TCP“三次握手”开始登场了。
请欣赏如下TCP三次握手经典图例:(客户端请求服务端获取数据)

1.第一次握手:客户端首先向服务端发送请求,tcp报文头中发送标识SYN=1(SYN表示客户端请求跟服务端建立连接),序号Seq=x。
2.第二次握手:服务端在接收到客户端发送的请求之后,需要告诉客户端已收到请求,tcp报文头中发送标识SYN=1,ACK=1(SYN表示服务端请求跟客户端建立连接,ACK表示对客户端的连接请求进行应答),序号Seq=y,确认号=x+1(表示对客户端发送的序号Seq=x的请求进行确认)。
3.第三次握手:客户端在接收到服务端发送的请求和确认信息之后,同样需要告诉服务端已收到信息,tcp报文头中发送标识ACK=1(ACK表示对服务端的连接请求进行应答),序号Seq=x+1,确认号Ack=y+1(表示对服务端发送的序号Seq=y的请求进行确认)
当三次握手都成功的时候,我们发现此时客户端发送的信息服务端能够收到并且服务端发送的信息客户端也能收到,通信双方连接成功。
这里我们要注意以下两点:
1、图中的发送请求中的发送标识SYN、ACK表示的是发送报文中两个标识位!而Seq和Ack分别代表发送序号和确认号。
2、服务端在接收到了客户端的连接请求后,回复中同时发送了SYN、ACK两个标识位,将建立连接的请求和对客户端的确认应答在同一个数据包中发送了,这也是为什么只需要三次握手,就能建立连接。
WireShark工具抓包演示效果:

3.为什么需要四次挥手
当客户端和服务端之间的数据传输完毕之后,我们就需要释放连接(一直建立连接会浪费资源),那为啥需要四次挥手呢?下面我们结合四次挥手经典图例一起分析下:

1.第一次挥手:客户端向服务端发送断开连接的请求,告诉服务端我这边不需要再请求你的数据了,tcp报文头中发送标识FIN=1(表示客户端请求跟服务端断开连接),序号Seq=u
2.第二次挥手:服务端在接收到客户端发送的断开请求后,需告诉客户端已收到请求,tcp报文头中发送标识ACK=1(ACK表示对客户端的断开连接的请求进行应答),序号Seq=v,确认号Ack=u+1(表示对客户端发送的序号Seq=u的请求进行确认)。
3.第三次挥手:当服务端数据传输完毕之后,向客户端发起断开连接的请求,告诉客户端我这边也不需要再发送数据了,tcp报文头中发送标识FIN=1,ACK=1(FIN表示服务端请求跟客户端断开连接,ACK表示对上一次客户端的断开连接的请求进行应答),序号Seq=w,确认号Ack=u+1(表示对客户端发送的序号Seq=u的请求进行确认)
4.第四次挥手:客户端接收到服务发送的断开连接请求后,需告诉服务端已收到信息,作出应答,tcp报文头中发送标识ACK=1(ACK表示对服务端的断开连接的请求进行应答),序号Seq=u+1,确认号Ack=w+1(表示对服务端发送的序号Seq=w的请求进行确认)
我想说到这里大家都会有几个疑问:
1、第二次挥手的时候。为什么不能像握手的时候一样,服务端对客户端断开连接的请求做确认应答的时候,同时向客户端发送断开连接的请求。这样“三次挥手”不就可以了么???
解答:在实际的网络中,服务端在接收到客户端断开连接的请求的时候,此时服务端可能还有数据没有传输完毕,不能立即向客户端发送断开连接的请求!所以当客户端主动发起断开请求的时候,服务器先回应一个确认,等所有数据传输完毕后再发送服务器断开的请求。
2、在图中我们能看到,客户端的TIME_WAIT状态会持续2MSL再变成CLOSED,MSL(Maximum Segment Lifetime)的中文可以译为“报文最大生存时间”!它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。那这里为什么需要维持2MSL呢?
解答:第4次挥手的时候客户端向服务端发送断开连接的请求的确认ACK,如果客户端发送完成后就直接就关闭连接,如果由于网络原因服务端没有收到ACK,那服务端就没法关闭连接了!因此客户端在回复确认后,还需要等待,万一服务端没有收到应答还会继续发送断开连接的请求;
4.TCP是如何保证可靠传输的
前面我们还说到TCP是可靠的,TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
简单来说,TCP通过这种通信双方相互应答确认和超时重传的机制来保证传输的可靠性。
感兴趣的同学可以多了解了解,每天丰富自己一点点。
简单说说TCP三次握手、四次挥手机制的更多相关文章
- [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...
- tcp三次握手四次挥手那些事
建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.三次握手,四次挥手流程图如下: 一.首先看下如何通过三次挥手----------建立连接 首先客户端发送连接请求报文,服务端接受连接后回复AC ...
- 网络 TCP三次握手,四次挥手详解
三次握手,四次挥手可以说是炙手可热的面试题了,来看看它究竟长什么样子吧! 我们先把流程图贴上来 : 为什么这么复杂? 因为TCP是可靠性传输. 确认可靠传输的前提: TCP连接管理机制 用TCP首部 ...
- TCP三次握手四次挥手,通俗易懂版
三次握手四次挥手 三次握手 其实很好理解,三次握手就是保证双手都有发送和接受的能力.那么最少三次才能验证完成 即----> 客户端发送---服务端收到----服务端发送-- 1.客户端发送 -- ...
- TCP三次握手/四次挥手详解
一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...
- TCP三次握手四次挥手
看到一篇总结很好的TCP三次握手,学习一下,原文链接. 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,S ...
- TCP三次握手四次挥手详解
转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...
- wireshark抓包直观图解 TCP三次握手/四次挥手详解
转http://www.seanyxie.com/category/linux/ 作者:seanyxie | 一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...
- 转---tcp三次握手四次挥手syn fin......
http://blog.chinaunix.net/uid-22312037-id-3575121.html转自 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协 ...
- TCP三次握手四次挥手详解2
相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...
随机推荐
- 一个C++版本的Sqlite3封装--SmartDb
Sqlite是一个非常轻量级的开源数据库,在嵌入式系统中使用的比较多,存储管理数据非常方便,Sqlite库提供的基于C语言的API,用起来也挺简单,但是有一点不太好的就是API使用起来有些繁琐,另外就 ...
- jpa jpql @query 动态查询
需求/背景 假设有一个用户表, 对应的用户实体: public class User { @Id Long id; //姓名 String name; //性别,男0女1 String sex; // ...
- JVM与Java体系结构
参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...
- puppet master/agent
puppet master/agent 配置 安装 master: yum install puppet-server agent: yum install puppet 自动签名 puppet的ma ...
- 某大型企业ospf面试题分析(含路由策略和路由过滤,及双点双向重发布)
面试问题背景 本面试题来自国内最大通信技术公司之一,央企,有很多金融网项目. 了解行业的同学,一定知道事哪个企业. 上面试问题(取自百哥收集整理的面试总结大全,关注百哥CSDN或知乎,不定期分享名企面 ...
- C#LeetCode刷题-字典树
字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% ...
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...
- Atomic原子类
Atomic原子类 Atomic原子类位于并发包java.util.concurrent下的java.util.concurrent.Atomic中. 1. 原子更新基本类型类 使用原子方式更新基本数 ...
- Kubernetes实战总结 - 自定义Prometheus
一.概述 首先Prometheus整体监控结构略微复杂,一个个部署并不简单.另外监控Kubernetes就需要访问内部数据,必定需要进行认证.鉴权.准入控制, 那么这一整套下来将变得难上加难,而且还需 ...
- Promise 解析
Promise 由于js的语言特性(用户交互)和工作环境(浏览器脚本),决定了它是单线程工作,所以两段脚本不能同时运行,但为了实现功能,所以人们使用了事件和回调来初步解决这个问题,例如(addEven ...