TCP三次握手那些事
临近5月,春招和实习招聘逐渐进入尾声。本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识。
参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次挥手)。
一般来说,TCP连接的过程是客户端发起,服务端确认请求,客户端再确认的三次握手过程。

具体三次如下:
1、客户端向服务器端发送SYN=1的TCP包,并附带初始序列号x。发送后,客户端的状态是SYN_SEND状态。
2、服务器端向客户端发送SYN=1,ACK=1的确认包,其序列号是服务器自己的序列号y,而确认序列号为x+1 。服务器端的状态是SYN_RCVD状态。
3、客户端再发送ACK=1的确认包,其序列号为x+1,确认序列号为y+1 。至此进入ESTABLISHED状态,TCP连接建立。
答到这里,面试官可能会问第二个问题:
能不能两次握手?
答案是不行。对于这个问题,RFC-793的原文是:
The principle reason for the three-way handshake is to prevent old
duplicate connection initiations from causing confusion. To deal with
this, a special control message, reset, has been devised. If the
receiving TCP is in a non-synchronized state (i.e., SYN-SENT,
SYN-RECEIVED), it returns to LISTEN on receiving an acceptable reset.
If the TCP is in one of the synchronized states (ESTABLISHED,
FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT), it
aborts the connection and informs its user.
我想大家都能理解。
很多时候,许多面经就到此为止了。但也经常会有一些扩展性问题,下面给出一些问题的解答:
1、TCP连接时,客户端不进行第三次握手会如何?
若不进行第三次握手,服务端将处在SYN_RCVD状态。若有很多(伪造的)客户端发起连接而不进行第三次握手,服务端不得不一一确认,并分配内存处理。
不仅如此,服务端要维护一个未连接队列,放置那些未完成的连接(半连接)。而大量伪造的连接将使半连接数达到最大值,使得正常连接被丢弃,最终导致网络瘫痪等问题。
这就是SYN洪泛,是一种拒绝服务攻击。
其实要识别这种攻击很简单,只要查看服务器上是否有大量的半连接即可。但这种攻击无法完全被阻止。
一种可行的方法是SYN Cookie,记录SYN连接的发起者,只有真正建立了连接,服务器才会为它分配内存。
还有其他方法例如过滤网关和增加最大半连接数。
2、TCP三次握手能否携带数据?
第三次握手是可以携带数据的。
3、TCP三次握手的开销过大?
T/TCP通过使用加速打开来避免三次握手:
1) 它为打开的连接指定一个32 bit的连接计数CC (Connection Count),无论主动打开还是
被动打开。一个主机的CC值从一个全局计数器中获得,该计数器每次被使用时加1。
2) 在两个使用T/TCP的主机之间的每一个报文段都包括一个新的TCP选项CC。这个选项
的长度为6个字节,包含发送方在该连接上的32bit的CC值。
3) 一个主机维持一个缓存,该缓存保留每个主机上一次的CC值,这些值从来自这个主机
的一个可接受的SYN报文段中获得。
4) 当在一个开始的SYN中收到一个CC选项的时候,接收方比较收到的值与为该发送方缓
存的CC值。如果接收到的CC比缓存的大,则该SYN是新的,报文段中的任何数据被
传递给接收应用进程(服务器)。这个连接被称为半同步。
如果接收的CC比缓存的小,或者接收主机上没有对应这个客户的缓存CC,则执行正常
的TCP三次握手过程。
5) 为响应一个开始的SYN,带有SYN和ACK的报文段在另一个被称为CCECHO的选项中
回显所接收到的CC值。
6) 在一个非SYN报文段中的CC值检测和拒绝来自同一个连接的前一个替身的任何重复的
报文段。
这种“加速打开”避免了使用三次握手的要求,除非客户或者服务器已经崩溃并重新启
动。这样做的代价是服务器必须记住从每个客户接收的最近的CC值。
4、TCP的初始序列号能否固定?
不建议,一是路由器会缓存数据包,导致序列号并非预期所设置;
二是如果序列号和四元组能够对应的话,那这个包就会被接受方确认。固定初始序列号容易被猜出,从而受到恶性攻击。
注:
本文主要引自《TCP/IP详解 卷一:协议》,部分内容源于网上。
如有侵权,请告知。
TCP三次握手那些事的更多相关文章
- TCP三次握手与四次挥手详解
目录 TCP三次握手与四次挥手详解 1.TCP报文格式 2.TCP三次握手 3.TCP四次挥手 4.为什么建立连接需要三次握手? 5.为什么断开连接需要四次挥手? 6.为什么TIME_WAIT状态还需 ...
- 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...
- TCP三次握手、四次挥手详解
1.TCP报文格式 TCP(Transmission Control Protocol) 传输控制协议.TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接. 我们需要 ...
- 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...
- TCP三次握手/四次挥手详解
一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...
- wireshark抓包工具简介以及tcp三次握手的一些含义
wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了.为了安全考虑, ...
- TCP三次握手四次挥手
看到一篇总结很好的TCP三次握手,学习一下,原文链接. 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,S ...
- TCP ,UDP概念和TCP三次握手连接 的知识点总结
OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...
- Wireshark基本介绍和学习TCP三次握手
wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...
随机推荐
- JavaSE笔记-注释
Annotation Annotation是一个接口,可以把Annotation当成一个修饰符 Annotation的定义 注解通过@interface定义 public @interface Tes ...
- django2.0无法加载外部css和js的问题
解决问题的思路来源于https://www.v2ex.com/t/430192 先是创建static目录,该目录与manage.py同级 然后在项目settings.py文件里添加 STATICFIL ...
- Windows7下PHP5.6.19+Apache2.4.18+MySql5.7环境配置
此安装参考了网上各方资料,最终整理的内容为本次安装涉及的部分. 一.准备安装材料: 1.从http://windows.php.net/download/ 下载5.6.19 线程安全版(使用apach ...
- java接口自动化基础知识(二)
二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...
- Machine Schedule poj1325
Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17454 Accepted: 7327 ...
- hdu3555数位dp基础
/* dp[i][0|1|2]:没有49的个数|最高位是9,没有49的个数|有49的个数 dp[i][0]=10*dp[i-1][0]-dp[i-1][1] dp[i][1]=dp[i-1][0] d ...
- Windows Internals 笔记——内核对象
1.每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息. 2.调用一个会创建内核对象的函数后,函数会返回一个句柄,它标 ...
- css实现右尖括号样式
.arrow{ width: 6px; height: 6px; border-top: 1px solid #999; border-right: 1px solid #999; transform ...
- module.exports与exports
API文档是枯燥的,下面本人收集了一些论坛经常有人疑问和开源代码中经常遇到的案例供大家研究一下. module.exports与exports的区别 每一个node.js执行文件,都自动创建一个mod ...
- Django搭建博客文章---模型层
页面展示所需字段 1.文章标题---文本类型 2.文章摘要---文本类型 3.文章内容--文本类型 4.唯一的ID标记---int数字类型(自增.主键) 5.发布日期--日期类型 模型层定义字段 1. ...