今天讲一下TCP的三次握手与四次挥手

1.首先说TCP 协议的特点:TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。
TCP 是TCP/IP 体系中非常复杂的一个协议,主要特点如下:
1) TCP 是面向连接的传输层协议。
2) 每条TCP 连接只能有两个端点,每条TCP 连接只能是点对点的(一对一)。
3) TCP 提供可靠的交付服务,保证传送的数据无差错、不丢失、不重复且有序。

这里是一个提问点:如何保证数据无差错、不丢失、不重复且有序的?有哪些机制来保证?
答:TCP 使用了校验、序号、确认和重传等机制来达到这一目的。

4) TCP 提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
这里是一个提问点:为什么需要设置缓存,缓存的作用?
答:发送缓存用来暂时存放以下数据:1.发送应用程序传送给发送方TCP 准备发送的数据;2.TCP 已发送但尚未收到确认的数据。
接收缓存用来暂时存放以下数据:1.按序到达但尚未被接收应用程序读取的数据;2.不按序到达的数据。
5) TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅视为一连串的无结构的字节流。
一个字节占一个序号,每个报文段用第一个字节的序号来标识,例如,一报文段的序号字段值是301, 而携带的数据共有l00B, 表明本报文段的数据的最后一个字节的序号是400, 因此下一个报文段的数据序号应从401开始,也就是期望的下一个序号(确认号)。

这里说下关于不同层的数据处理单位问题:网络的OSI定义的7层里,最底层的物理层传输的是比特流(bit)、倒数第2数据链路层处理的是以帧(frame)为单位的,再往上就是网络层处理的单位是报文(message),再往上是传输层,还是使用报文,传输层是上三层逻辑层与下三层物理层的一个中间层。每一层都会把前一层把数据处理打包一次,例如物理层传到数据链路层,数据链路层就会把比特处理打包成帧,网络层就会把帧处理打包成报文。

TCP 是面向连接的协议,因此每个TCP 连接都有三个阶段:连接建立、数据传送和连接释放。

三次握手建立连接:

部分字段解释:
1) 序号字段(就是seq):序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
2) 确认号字段(就是ack):是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号为N, 则表明到序号N-1为止的所有数据都已正确收到。(累积确认)
3) 确认位ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK置1。
4) 同步位SYN:同步SYN=1表示这是一个连接请求或连接接收报文。当SYN= 1, ACK=0 时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN= 1, ACK=1。即SYN=1 表示这是一个连接请求或连接接收报文。
5) 终止位FIN (Finish) :用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕了并要求释放传输连接。

三次握手具体步骤:
1) 第一次握手:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1。另外,客户机会随机选择一个起始序号seq = x(连接请求报文不携带数据,但要消耗一个序号)。
2) 第二次握手:服务器的TCP 收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN 和ACK 位都被置为1, 确认号字段的值为x+1,并且服务器随机产生起始序号seq= y( 确认报文不携带数据,但也要消耗一个序号)。确认报文段同样不包含应用层数据。
3) 第三次握手:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK 标志位被置1, 序号字段为x+1, 确认号字段ack=y+1。该报文段可以携带数据,若 不携带数据则不消耗序号 http中的tcp连接的第三次握手的报文段中就捎带了客户对万维网文档的请求。
成功进行以上三步后,就建立了TCP 连接,接下来就可以传送应用层数据。TCP 提供的是全双工通信, 因此通信双方的应用进程在任何时候都能发送数据。

【总结】:
1) 第一次握手:客户机向服务器发送连接请求报文段;
2) 第二次握手:服务器收到连接请求并确认,表明我收到你的请求了;
3) 第三次握手:客户机收到服务器的确认报文后向服务器给出确认,表明我收到你的确认了 。

【拓展问题1】:什么是SYN洪泛攻击?(三次握手机制有什么问题?)
答:由于服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的,攻击者发送TCP的SYN报文段,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状 态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻 击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户 提供服务了。
【拓展问题2】:如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两 小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一
次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
【拓展问题3】:为什么不采用“两次握手”建立连接呢?
答:这主要是为了防止两次握手情况下已失效的连接请求报文段突然又传送到服务器而产生错误。考虑下面这种情况。客户A 向服务器B 发出TCP 连接请求,第一个连接请求报文在网络的某
个结点长时间滞留, A 超时后认为报文丢失,于是再重传一次连接请求, B 收到后建立连接。数
据传输完毕后双方断开连接。而此时,前一个滞留在网络中的连接请求到达服务器B, 而B 认为A 又发来连接请求,此时若使用“三次握手”,则B 向A 返回确认报文段,由于是一个失效的请求,因
此A 不予理睬,建立连接失败。若采用的是“两次握手”,则这种情况下B 认为传输连接已经建立,
并一直等待A 传输数据,而A 此时并无连接请求,因此不予理睬,这样就造成了B的资源白白浪费。

四次挥手释放连接

1) 第一次挥手:客户机打算关闭连接时,向其TCP发送一个连接释放报文段,并停止发送数据,主动关闭TCP 连接,该报文段的FIN 标志位被置1, seq= u, 它等于前面已传送过的数据的最后一个字节的序号加1 (FIN 报文段即使不携带数据,也要消耗一个序号)。TCP是全双工的,即可以想象为一条TCP 连接上有两条数据通路。发送FIN 报文时,发送FIN 的一端不能再发送数据,即关闭了其中一条数据通路, 但对方还可以发送数据。
2) 第二次挥手:服务器收到连接释放报文段后即发出确认,确认号是ack = u + 1, 而这个报文段自己的序号是v, 等千它前面已传送过的数据的最后一个字节的序号加1 。此时,从客户机到服务器这个方向的连接就释放了TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
3) 第三次挥手:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文段。
4) 第四次挥手:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1, 确认号ack= w + 1, 序号seq= u + 1 。此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后,A才进入连接关闭状态。

【总结】:
1) 第一次挥手:客户机向服务器发送连接释放报文段,并停止发送数据,主动关闭TCP连接;
2) 第二次挥手:服务器收到释放报文段后确认,这个时候客户机到服务器之间的连接已经关闭,但服务器到客户机的连接没有关闭,因为如果服务器还要发送数据,客户机仍要接受的;
3) 第三次挥手:如果服务器没有数据要发送给客户机,就发出连接释放报文段给客户机;
4) 第四次挥手:客户机收到释放报文段后发出确认。此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后才进入连接关闭状态。

【计算机网络】TCP的三次握手与四次挥手的更多相关文章

  1. 你应该这么理解TCP的三次握手和四次挥手

    前言: TCP协议是计算机的基础,他本身是一个非常非常复杂的协议. 本文只是蜻蜓点水,将从网络基础以及TCP的相关概念介绍开始,之后再将三次握手,四次挥手这些内容来阐述. 最后介绍一些常见问题,并给出 ...

  2. TCP的三次握手与四次挥手

    TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...

  3. TCP/IP三次握手与四次挥手的正确姿势

    0.史上最容易理解的:TCP三次握手,四次挥手 https://cloud.tencent.com/developer/news/257281 A 理解TCP/IP三次握手与四次挥手的正确姿势http ...

  4. TCP的三次握手与四次挥手详解

    TCP的三次握手与四次挥手是TCP创建连接和关闭连接的核心流程,我们就从一个TCP结构图开始探究中的奥秘  序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序 ...

  5. 【图解】给面试官解释TCP的三次握手与四次挥手-Web运用原理及网络基础

    作者 | Jeskson 来源 | 达达前端小酒馆 轻松了解HTTP协议 为什么要学习网络协议呢?为什么要学习计算机完了呢?显然这很重要,至少能够帮助你找到工作的原因之一,学习网络知识点太多太多,没有 ...

  6. TCP的三次握手与四次挥手笔记

    TCP的三次握手与四次挥手笔记 TCP Flags URG: 紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接过程 FIN: finish ...

  7. TCP的三次握手与四次挥手理解及面试题

    TCP的三次握手与四次挥手理解及面试题(很全面) 转载自:https://blog.csdn.net/qq_38950316/article/details/81087809 本文经过借鉴书籍资料.他 ...

  8. TCP 的三次握手和四次挥手

    参考资料: 1.TCP的三次握手与四次挥手理解及面试题: 2.Http协议三次握手和四次挥手: 3.TCP通信的三次握手和四次撒手的详细流程(顿悟) 前置: 序号(也称序列号) - Sequence ...

  9. WireShark抓包分析以及对TCP/IP三次握手与四次挥手的分析

    WireShark抓包分析TCP/IP三次握手与四次挥手 Wireshark介绍: Wireshark(前称Ethereal)是一个网络封包分析软件.功能十分强大,是一个可以在多个操作系统平台上的开源 ...

随机推荐

  1. JSP response.setCharacterEncoding与response.setContentType的区别

    问题描述 昨天在参考别人的项目时,发现页面引用js,css等文件总是乱码,后来才发现是MIME类型统一设置为text/html,并且仅仅编码设置了浏览器端的解析编码.另外,可以先通过文本编辑器(如no ...

  2. Jackson转换为Collection、Array

    1. Jackson转化为Array 注意的地方就是实体类一定要有无参的构造方法,否则会报异常 //com.fasterxml.jackson.databind.exc.InvalidDefiniti ...

  3. CSS:第1课

    CSS选择器有:id选择器.派生选择器 1.id选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式. id 选择器以 "#" 来定义. #red {colo ...

  4. Linux-一次执行多个命令 ; && ||

    一次执行多个命令,多个命令之间用:号隔开 cmd1;cmd2:cmd3 这样前后执行的时候没有依赖性,如果有下列要求呢 1. cmd1执行失败那就不要执行后面的命令 2. cmd1失败了才去指令后面的 ...

  5. jdk1.5新特性之------->可变参数

    /* jdk1.5新特性之------->可变参数 需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定). 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1 ...

  6. 私有化轻量级持续集成部署方案--02-Nginx网关服务

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 这一篇中使用 Nginx 部署网关中心,用来代理服务器中服务.网关中心有优点也有缺点,也可以不采用网关系统. 部署 ...

  7. 组合&反射&面向对象内置函数

    内容概要 组合 反射 面向对象的内置函数 异常 内容详细 一.组合 组合:在对象中定义一个属性,属性的值是另一个对象 除了继承父类的方法,这是获取另一个类中属性的另一种方式 如果想给学生对象添加课程属 ...

  8. 我们一起来学Shell - shell的条件判断

    文章目录 Shell 条件测试语法 符号说明 Shell 测试表达式 文件测试表达式 字符串测试表达式 整数操作符 逻辑操作符 测试表达式的区别总结 Shell 条件判断之if语句 单分支 IF 条件 ...

  9. Dubbo源码剖析三之服务注册过程分析

    Dubbo源码剖析二之注册中心 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中对注册中心进行了简单的介绍,对Dubbo整合Zookeeper链接源码进行了详细分析.本文接着对服务注册过 ...

  10. Spring Boot数据访问之Druid连接池的配置

    在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...