三次握手


我们先提出一些问题,但是我们暂且不回答这些问题,下面我会尽我所能详尽地讲解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. Hive实战UDF 外部依赖文件找不到的问题

    目录 关于外部依赖文件找不到的问题 为什么要使用外部依赖 为什么idea 里面可以运行上线之后不行 依赖文件直接打包在jar 包里面不香吗 学会独立思考并且解决问题 继承DbSearcher 读取文件 ...

  2. 分布式可扩展web体系结构设计实例分析

    Web分布式系统设计准则 下面以一个上传和查询图片的例子来说明分布式web结构的设计考虑和常用的提高性能的方法.该例子提供上传图片和下载图片两个简单功能,并且有一下假设条件?: - 可以存储无上限数量 ...

  3. BUUCFT pwn asis2016_b00ks

    看师傅们wp的时候,我才知道这个道题是wiki上面的例题.我看了一些师傅的wp,发现大家都是一种做法,都是通过mmap堆地址,来找libc基地址的.而我试了一下fastbisn attack,发现也可 ...

  4. how2heap学习(二)

    拖了好久,但是在期间做了几道pwn题目,发现堆原来也没有想象中的难. fastbin_dup_into_stack 这个说白了,就是利用double free可以进行任意地址的写,说是任意地址不准确, ...

  5. ansible自定义模块

    参考官网:http://www.ansible.com.cn/docs/developing_modules.html#tutorial 阅读 ansible 附带的模块(上面链接)是学习如何编写模块 ...

  6. LuoguP2108 学英语 题解

    Content 给出整数 \(x\) 的英文写法,求出这个整数 \(x\). 规则详见题面. 数据范围:\(|x|\leqslant 999999999\)(\(9\) 个 \(9\)). Solut ...

  7. CF675A Infinite Sequence 题解

    Content 给定三个整数 \(a,b,c\),问你 \(b\) 是否在以 \(a\) 为首项,公差为 \(c\) 的等差数列中. 数据范围:\(-10^9\leqslant a,b,c\leqsl ...

  8. CF157A Game Outcome 题解

    Content 有一个 \(n\times n\) 的矩阵,每个元素都有一个权值.求所有满足其所在纵列所有元素权值和大于其所在横列所有元素权值和的元素个数. 数据范围:\(1\leqslant n\l ...

  9. LuoguP5006 [yLOI2018] 大美江湖 题解

    Content 题意实在是太过复杂了,因此请回到题面查看. Data Range 本部分和 Solution 部分变量的含义同题面. \(1\leqslant n,m\leqslant 100,0\l ...

  10. java 多线程:Thread类;Runnable接口

    1,进程和线程的基本概念: 1.什么是进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机 ...