三次握手


我们先提出一些问题,但是我们暂且不回答这些问题,下面我会尽我所能详尽地讲解TCP的三次握手过程,然后看完你可以在评论区留下你对问题的答案,我们可以一起探讨。

  • 为什么要握手
  • 为什么是三次而不是两次或者四次
  • 相比不需要握手的UDP有什么优点和缺点
  • 握手的过程可以携带数据吗
  • 握手的过程会带来什么安全问题吗

TCP被称为是面向连接的,这是因为一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先互相“握手”,以建立确保数据传输的参数。

下面放一张图



首先cilent向server发送SYN(用于建立连接的字段)报文,这里seq取一个随机数(不知道seq作用的可以另外单独理解,不妨碍理三次握手),这个报文是不携带数据的,然后发送完之后,cilent就变成SYN_SENT状态(等待接受ack报文)并且可能建立发送缓冲区,然后server接受到cilent的请求连接报文之后(第一次握手),发送SYN-ACK报文,同样不携带数据,在这一时间也可能建立接受缓冲区,注意到这里,因为这个特质,导致服务器可能被洪范攻击

(假如攻击者发送大量TCP SYN报文(第一次握手),然后又不进行第三次握手,服务器就要为这些大量的第一次握手分配资源(比如缓存),导致服务器的连接资源被消耗殆尽(当然魔高一尺,道高一丈,有一种防御系统SYNcookie可以应对))

最后客户端接受到SYN-ACK报文后发送第三次握手,注意这一次握手是可以携带数据的

整个过程就像你游戏开语音,你进去csgo的时候,会主动开麦(客户端),喂喂听得到吗,然后队友说能听到,你能听到我的吗(第二次握手),最后你说,我也能听到你说话,接下来我们怎么怎么打(第三次握手),假如两次握手的话,我是知道队友能听见我说话了我也能听见队友说话了,但是你管队友了吗。四次的话,废话少说吧就

TCP的握手确保了双方都能全双工地进行通信,使得通信是有保障的,当然这样也会浪费一些时间,但是是值得的,大部分重要的事情还是求稳比较好,这也是TCP存在的意义,可靠且值得交付。

好了讲完之后我再给大家留个问题,那个seq有什么作用大家能回答吗(提醒,假如我说喂,你听得到吗,假如对面恰巧没带耳机,没听到怎么办,又或者团队游戏,他不知道是哪个人在发言怎么办)

四次挥手


  • 为什么是四次挥手
  • 为什么要TIME_WAIT或者CLOSE_WAIT
  • TIME_WAIT的时间设置为多长比较好

老规矩先上图

这是一个较为简单的报文交换图,中间省去了很多状态(都是逻辑状态,省略了就省略了吧)。因为是全双工通信,所以当客户端首先发送FIN报文时,就是想告诉服务器,它要关闭连接了,接收到ACK进入一个FIN_WAIT2的状态,这个时候客户端就已经不在发送数据了。那么问题来了,还要保持连接干嘛?为什么不直接关闭连接

那是因为客户端的数据是发送完了,服务端数据还不一定发送完了呢。你问人家一个问题,你是问完了,人家还不一定回答完了你就打断人家不太好吧。所以当服务端发送完数据后就发送FIN报文给客户端,这个时候客户端再发送ACK告诉服务端说收到。

但是注意!!这个时候连接还没有关闭噢,你想想,假如这个ack报文丢失了怎么办,前面的报文丢失,都可以超时重传,但是这里客户端你就直接关闭连接,假如ack丢失,服务端一直在等你的答复你却已经走了,是不是也不太好。所以即使发送完最后的ack应答报文,会有一个TIME_WAIT的时间,这样当ack丢失时,服务端超时未收到会再发一次FIN,客户端就知道丢失了重传

那么这个wait的时间是多久呢,因为当超过一个MSL时,重发FIN,重发FIN最多需要一个MSL,客户端知道丢失的时间最长为2MSL,所以wait的时间为2MSL

彻彻底底地理解TCP三次握手和四次挥手的全部过程的更多相关文章

  1. 理解TCP三次握手和四次挥手

    TCP相关知识 TCP是面向连接的传输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议并没有明确要求必须使用TCP协 ...

  2. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  3. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  4. TCP‘三次握手’和‘四次挥手’(通俗易懂)

      概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...

  5. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...

  6. 学习 TCP 三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...

  7. TCP三次握手和四次挥手、HTTP协议

    TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道.     在Http工作之前,Web浏览器通过网络和W ...

  8. 浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面

    (1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与 ...

  9. TCP 三次握手和四次挥手

    TCP 三次握手和四次挥手 作为面试会被经常考察的的点,自己复习了一下,总结如下: TCP 三次握手 先上图: 所谓三次握手,是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包. 第一 ...

随机推荐

  1. thinkPHP跨数据库访问/数据库切换

    在项目的开发中会遇到访问多个数据库的问题这里讲的是:访问同一地址下的多个数据库 第一步:在配置文件中配置你要连接的其他的数据库 例如:我现在默认的数据库是back 现在我要设置第二个数据库travel ...

  2. Android工具 - 随机测试(猴子)

    原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6697535 本文章的前提:已经安装了Eclipse和ADT.androi ...

  3. .Net Core服务诊断排查

    前言: 近期在项目中出现了几次服务内存资源占用较高的情况,特回顾梳理下排查过程以及对相应问题的排查方法总结. 一.Dump抓取 抓取dump的方式有多种,下面介绍几种常用的: 1. 任务管理器中找到程 ...

  4. java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore

    在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...

  5. python 字符编码讲解

    ANSI不是一种具体的编码格式 ANSI在中文Windows操作系统代码指的是GBK编码 ANSI在中文Mac操作系统代码指的是UTF-8编码 ANSI在其他国家的操作系统中有其他的编码格式 #ASC ...

  6. 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;

    multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...

  7. C++ 11新特性:std bind 原理简单图解(转载)

    本文解释了bind 是如何工作的.为了清晰,我对图中的语法作了一些简化(例如,省略函数调用操作符的参数类型),并且简化了 bind 的实现. bind 可以用来将用户提供的需要一个参数的函数转换成不需 ...

  8. js(JQuery)引入select2

    官方项目地址:https://select2.org/ 引入css和js <link href="https://cdnjs.cloudflare.com/ajax/libs/sele ...

  9. 【LeetCode】1414. 和为 K 的最少斐波那契数字数目 Find the Minimum Number of Fibonacci Numbers Whose Sum Is K

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...

  10. 【LeetCode】167. Two Sum II - Input array is sorted 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...