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是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...
随机推荐
- 关于stm32的数据类型
常见的uint16_t.uint32_t.u8.u16等 定义在stm32f10x.h文件中,这个文件是定义相关数据类型和结构体的头文件.
- sqlserver 迁移
背景 好久没用sqlserver了,好多东西也都记不住了,这次sqlserver同事问了几个问题,也一就回忆下.主要也把sqlserver的迁移过程列下.具体就不多说了. sqlserver 特点是只 ...
- 【easy】234. Palindrome Linked List
ques: 判断一个链表是否回文 Could you do it in O(n) time and O(1) space? method:先将链表分为两部分,将后半部分反转,最后从前往后判断是否相等. ...
- Python基础【第一篇】
一.Python简介 Python的创始人(Guido von Rossum 荷兰人),Guido希望有一种语言既能像C一样方便地调用操作系统的功能接口,也能像shell脚本一样,轻松地实现编程,A ...
- 51nod--1079 中国剩余定理
题目: 1079 中国剩余定理 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K ...
- java 查找类的所有子类
package _02; import java.io.File; import java.net.URL; public class MainTest_FindAllSubClass { publi ...
- PHP实现微信商户支付企业付款到零钱功能代码实例
本文为大家分享了PHP实现微信商户支付企业付款到零钱的具体代码,供大家参考,具体内容如下 微信支付开发文档 一.开通条件 企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付 ...
- CSS/Xpath 选择器 第几个子节点/父节点/兄弟节点
0.参考 1.初始化 In [325]: from scrapy import Selector In [326]: text=""" ...: <div> ...
- Grafana和influxdb监控nginx日志中的请求响应时间图形化监控
监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...
- Linux下如何查看系统启动时间和运行时间以及安装时间
1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.00 2.查看/proc/uptime文件计算 ...