(声明:本文是阅读此文的总结笔记)

面试中对于该知识点的考察频繁,一般作为面试的暖场问题,你能够答出多少,答得多深刻,条理多清晰,给面试官的印象真的很重要。

三次握手的过程

TCP是面向连接的,全双工的,可靠的协议。无论哪一方要发送数据,必须双方先建立一条连接。建立连接的过程就是三次握手。三次握手过程中双方进入ESTABLISHED状态,并且交换了连接双方的序列号和TCP窗口的大小信息。

三次握手哪三次呢

  1. 第一次握手: 建立连接, 客户端发送请求报文段,将SYN位置为1,Sequence Number 为x,然后客户端进入SYN_SENT状态,等待服务器的确认
  2. 第二次握手:服务端收到SYN报文段,从LISTEN状态进入到SYN_RECEV状态,然后需要回应客户端的请求,并且发送自己的SYN请求信息,讲SYN设为1,Sequence Number 是 y; 服务器端将上述所有信息放到一个报文(SYN + ACK)一并发送给客户端。
  3. 第三次握手:客户端收到服务端的SYN+ACK报文段,然后将ACknowledge Number 设置为y+1 , 向服务发送ACK报文段,这个报文段发送完毕后且服务端成功接收数据,客户端和服务端同时进入ESTABLISHED状态。

过程中说清楚状态转换过程非常的重要。

为什么需要三次握手

为了防止已失效的连接请求报文段又传送到了服务端,因而产生错误。

同时书中举例子:

失效的连接请求报文段是这种情况,他并没有在线路中丢失,而是在某个网络节点长期滞留了,以致延误到达,但是接收方并不知道这个报文的有效性与否,如果接收方在这第二次握手此时建立连接,接收方已经建立连接,显然是单方的,所以必须并进行第二次握手,然而这将是不会再收到回应了,也就避免在这种异常情况下建立连接。

同时发起连接请求怎么办

这种情况可能性较小,但不是不可能发生,双方使用对方熟知的端口作为本地端口,且同时发起连接请求,最终建立一条连接而不是两条。双方同时发送SYN数据包,同时进入SYN_SEND状态。当每一方收到SYN时候,双方又进入SYN_RECEV状态.并且发送SYN进行确认。双方都收到确认报文的时候又同时进入ESTABLISHED状态。这时候交换的是四个报文而不是三个。这是同时打开的情况。

三次握手是否完美

肯定不是完美的,有一种攻击叫做SYN攻击。我们可以不断的利用伪造的IP数据包向服务器发送TCP连接请求并且把自己隐藏好,服务器根据IP来寻找客户端,所以TCP的第二次握手会失败。伪造大量IP数据包会让服务忙于处理队列中的连接,系统资源被大量的小号。 SYN攻击是TCP协议的一个bug,无法避免。

后续思考

连接过程中有哪些异常的情况。建立连接后的流量控制,超时重传,数据包重排等功能。

最新文章

  1. dede自定义表单增加添加时间怎么弄
  2. Codeforces 4538 (状态压缩dp)Little Pony and Harmony Chest
  3. 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
  4. angularJS 源码阅读之一:toDebugString
  5. Java中的代码点和代码单元(转)
  6. 洛谷 P2404 自然数的拆分问题
  7. python filter函数应用,过滤字符串
  8. python中赋值-浅拷贝-深拷贝之间的关系
  9. PTA 7-50 畅通工程之局部最小花费问题(最小生成树Kruskal)
  10. BZOJ3233:[AHOI2013]找硬币(DP)
  11. error: insufficient permissions for device(解决adb shell问题)
  12. 一致性哈希Java源码分析
  13. linux下10款markdown软件
  14. 【BZOJ5252】林克卡特树(动态规划,凸优化)
  15. SPOJ—VLATTICE Visible Lattice Points(莫比乌斯反演)
  16. mdadm 软RAID
  17. ruby on rails 环境搭建(mac or ubuntu)
  18. 多线程中的超时, 如Socket超时
  19. iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局
  20. Ubuntu相关命令

热门文章

  1. 2022-05-09内部群每日三题-清辉PMP
  2. c++ sizeof详解
  3. CVE-2020-1938 Tomcat AJP漏洞复现
  4. 083_SFDC Limit(二) 及良好的开发习惯
  5. Angular 依赖注入的错误 NullInjectorError, No provider for XXX
  6. git 删除本地分支以及远程分支
  7. 微服务笔记之Eureka03(服务续约分析)
  8. 用requests-html和SelectorGadget轻松精准抓取网页数据
  9. java中indexOf()获取指定次数的下标
  10. webpack的核心概念