TCP 协议之三次握手(一)
(声明:本文是阅读此文的总结笔记)
面试中对于该知识点的考察频繁,一般作为面试的暖场问题,你能够答出多少,答得多深刻,条理多清晰,给面试官的印象真的很重要。
三次握手的过程
TCP是面向连接的,全双工的,可靠的协议。无论哪一方要发送数据,必须双方先建立一条连接。建立连接的过程就是三次握手。三次握手过程中双方进入ESTABLISHED状态,并且交换了连接双方的序列号和TCP窗口的大小信息。
三次握手哪三次呢
- 第一次握手: 建立连接, 客户端发送请求报文段,将SYN位置为1,Sequence Number 为x,然后客户端进入SYN_SENT状态,等待服务器的确认
- 第二次握手:服务端收到SYN报文段,从LISTEN状态进入到SYN_RECEV状态,然后需要回应客户端的请求,并且发送自己的SYN请求信息,讲SYN设为1,Sequence Number 是 y; 服务器端将上述所有信息放到一个报文(SYN + ACK)一并发送给客户端。
- 第三次握手:客户端收到服务端的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,无法避免。
后续思考
连接过程中有哪些异常的情况。建立连接后的流量控制,超时重传,数据包重排等功能。
最新文章
- dede自定义表单增加添加时间怎么弄
- Codeforces 4538 (状态压缩dp)Little Pony and Harmony Chest
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- angularJS 源码阅读之一:toDebugString
- Java中的代码点和代码单元(转)
- 洛谷 P2404 自然数的拆分问题
- python filter函数应用,过滤字符串
- python中赋值-浅拷贝-深拷贝之间的关系
- PTA 7-50 畅通工程之局部最小花费问题(最小生成树Kruskal)
- BZOJ3233:[AHOI2013]找硬币(DP)
- error: insufficient permissions for device(解决adb shell问题)
- 一致性哈希Java源码分析
- linux下10款markdown软件
- 【BZOJ5252】林克卡特树(动态规划,凸优化)
- SPOJ—VLATTICE Visible Lattice Points(莫比乌斯反演)
- mdadm 软RAID
- ruby on rails 环境搭建(mac or ubuntu)
- 多线程中的超时, 如Socket超时
- iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局
- Ubuntu相关命令
热门文章
- 2022-05-09内部群每日三题-清辉PMP
- c++ sizeof详解
- CVE-2020-1938 Tomcat AJP漏洞复现
- 083_SFDC Limit(二) 及良好的开发习惯
- Angular 依赖注入的错误 NullInjectorError, No provider for XXX
- git 删除本地分支以及远程分支
- 微服务笔记之Eureka03(服务续约分析)
- 用requests-html和SelectorGadget轻松精准抓取网页数据
- java中indexOf()获取指定次数的下标
- webpack的核心概念