详解TCP的三次握手

这篇具有很好参考价值的文章主要介绍了详解TCP的三次握手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP定义及特点

定义

TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,发送后会启动一个定时器,然后另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据

特点

  • TCP是面向连接的传输控制层协议
  • 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
  • TCP提供可靠交付的服务
  • TCP提供全双工通信。数据在两个方向上独立的进行传输,因此,连接的每一端必须保持每个方向上的传输数据序号。
  • 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但应用程序交下来的数据仅仅是一连串的无结构的字节流

TCP报文

在开始三次握手之前,看下TCP报文的数据结构

  • TCP首部
  • TCP数据部分
    详解TCP的三次握手

着重看TCP头部结构,如下
详解TCP的三次握手
了解一下什么是序列号和确认号

  • Sequence number

表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。(注意这里使用的是“应该”。因为对于没有数据的传输,如ACK,虽然它有一个seq,但是这次传输在整个data stream中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送ACK的数据包的seq开始)

  • Acknowledge number

表示的是期望的对方(接收方)的下一次sequence number是多少,一旦连接建立成功,ACK值一直为1。

三次握手

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

详解TCP的三次握手
第一次握手:标志位SYN = 1,随机生成一个序列号seq1 = x
第二次握手:标志位SYN ,ACK = 1,确认号ack = x + 1,随机生成一个序列号seq2=y
第三次握手:标志位ACK = 1, 确认号ack = y + 1,seq2= x + 1

SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一,但是,对于ACK的传输,不会让下一次的传输packet加一,也就是说,下一个实际有数据的传输,依旧从上一次发送ACK的数据包的seq开始计算

网络抓包分析

上面给了具体的连接过程,但是偏理论,下面实战一下,通过抓包进行分析
详解TCP的三次握手
具体查看每一次握手都做了什么(主要看序列号,确认号)
详解TCP的三次握手
详解TCP的三次握手
详解TCP的三次握手
有图有真相,不怕你不信
参考链接:https://www.jianshu.com/p/15754b4e9458

常见问题

问题一:为什么不是两次握手,而是三次握手

前两次握手客户端可以确认服务端的接收和发送是正常的(一个来回),但是服务端却不知道客户端的发送能力是否正常,那 TCP 的可靠性就无从谈起,所以需要第三次握手来确认双方的收发能力,以确保TCP连接的可靠性。

问题二:TCP的三次握手都可以携带数据吗?如果不是,那么哪一次握手可以携带数据,其他的为啥不能携带数据?

假设第一次握手客户端携带数据到服务器,服务器解析并存储此次连接的信息,如果数据量大,服务端就要分配足够的内存来进行存储,假如有黑客while(1000000000)来新建连接,结果可想而知,服务器将会被占用大量的内存。
第三次握手,此时对于客户端来说,连接已经建立,客户端携带数据完全没有问题

问题三:传输的过程中,报文丢失了怎么办

  • 第一次握手报文丢失
客户端发送 SYN 报文,然后进入到 SYN_SENT 状态。
客户端迟迟收不到服务端的 SYN-ACK 报文,就会触发客户端的超时重传机制。
在 Linux 里,客户端的 SYN 报文最大重传次数由/proc/sys/net/ipv4/tcp_syn_retries内核参数控制,这个参数是可以自定义的,默认值一般是 5。每次超时的时间是上一次的 2 倍。当第五次超时重传后,会继续等待 32 秒,如果服务端仍然没有回应 ACK,客户端就不再发送 SYN 包,然后断开 TCP 连接。
  • 第二次握手报文丢失
第二次握手时,服务端会进入 SYN_RCVD 状态
客户端角度:客户端第一次握手发出去的报文没有得到回复,那么客户端就会觉得自己的 SYN 报文丢失,于是客户端就会触发超时重传机制,重传 SYN 报文。
服务端角度:发送SYN_ACK报文后将会开启一个定时器,如果报文没有得到回应,就会触发超时重传机制,重传 SYN-ACK 报文,重传的次数由/proc/sys/net/ipv4/tcp_synack_retries控制,默认是5次。
  • 第三次握手报文丢失
服务端角度:发送SYN_ACK报文后将会开启一个定时器,如果超过了定时器设置的时间都没有收到客户端的ACK,将会重发SYN_ACK包。由/proc/sys/net/ipv4/tcp_synack_retries控制,默认是5次。
客户端角度:此时非彼时,现在我是 ACK 报文,拥有独特的权限,所以我是不会重传的

问题四:什么情况下报文失效或丢弃

  • 服务端的半连接队列(syns quene)满了,客户端就一直在超时重传 SYN 报文,直到达到最大的重传次数
  • 服务端的连接队列(accept quene)满了
    详解TCP的三次握手
TCP的全连接和半连接队列

当服务端调用listen()函数监听端口的时候,内核会为每个监听的socket创建两个队列

  • 半连接队列(syn queue):客户端发送SYN包,服务端收到后回复SYN+ACK后,服务端进入SYN_RCVD状态,这个时候的socket会放到半连接队列。
  • 全连接队列(accept queue):当服务端收到客户端的ACK后,socket会从半连接队列移出到全连接队列。当调用accpet函数的时候,会从全连接队列的头部返回可用socket给用户进程。

在4.3版本之前的内核,SYN队列的最大大小以前是用net.ipv4.tcp_max_syn_backlog来配置,但是现在已经不再使用了。
现在用net.core.somaxconn来同时表示SYN队列和Accept队列的最大大小

查看某一个端口(也就是一个服务)的连接状况
ss 命令
ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

# ss
Netid  State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port
tcp    ESTAB  0       0       10.0.2.10:ssh       10.0.2.2:52316

Recv-Q:半连接队列
Send-Q:全连接队列文章来源地址https://www.toymoban.com/news/detail-448356.html

到了这里,关于详解TCP的三次握手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP的三次握手,四次挥手

    第一次握手:客户端发送SYN报文,井发送seq为x序列号给服务端,等待服务端的确认 第二次握手:服务端发送SYN+ACK报文,并发送seq为Y的序列号,在确认序列号为x+1 第三次握手:客户端发送ACK报文,并发送seq序列号为z,在确认序列号为y+1 第一次挥手:先由客户端向服务器端发

    2024年01月18日
    浏览(72)
  • TCP的三次握手、四次挥手

    首先我们要知道建立连接的目的是什么,我们是为了可靠的传输数据。那既然是可靠的传输数据,我们必须保证客户端和服务端都能正常的发送和接收数据,如果某一方不能正常的发送或者接收数据,那整个数据的传输就不能成功,也就不可靠。 三次握手 1.第一次握手:第一

    2024年02月10日
    浏览(42)
  • TCP的三次握手四次挥手

    TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。 四次挥手:即终止TCP连接,就是指断开一个T

    2024年02月11日
    浏览(39)
  • TCP的三次握手和4次挥手

    最开始,人们考虑到将网络信息的呼唤与回应进行规范,达成一种公认的协议,就好像没有交通规则的路口设定交通规则。 人们设计出完美的OSI协议,这个协议包含七个层次由下到上分别是: 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。 大家都觉得很

    2024年03月21日
    浏览(50)
  • 一文读懂TCP的三次握手(详细图解)

    在学习TCP三次握手的过程前,首先熟悉几个缩写简称: TCB 传输控制块,打开后服务器 / 客户端进入监听( LISTEN )状态 SYN TCP报文标志位,该位为 1 时表示发起一个新连接 ACK TCP 报文标志位,该位为1时,确认序号有效 ,确认接收到消息。 TCP 规定,在连接建立后所有报文的传

    2024年02月09日
    浏览(56)
  • Wireshark抓包分析TCP的三次握手

    一、TCP三次握手连接建立过程     Step1:客户端发送一个SYN数据包(SYN=1,Seq=X,ACK=0)给服务端,请求进行连接,这是第一次握手;     Step2:服务端收到请求并且允许连接的话,就会发送一个SYN+ACK的数据包(SYN=1,Seq=Y,ACK=X+1)给发送端,告诉它,可以通讯了,并且让客户

    2024年02月08日
    浏览(43)
  • TCP的三次握手与四次挥手

    参考文章:https://blog.csdn.net/qq_38950316/article/details/81087809 在介绍三次握手与四次挥手之前我们先来了解一下TCP的头部结构是什么样的。 TCP头部的最大长度为60字节,其中包括 TCP报文固定长度20字节+可变字节(最大40字节) ,具体结构如下: 在认识三次握手与四次挥手之前我们必

    2023年04月09日
    浏览(43)
  • TCP的三次握手以及四次断开

    TCP的三次握手和四次断开,就是TCP通信建立连接以及断开的过程 目录 【1】TCP的三次握手过程  ----  TCP建立连接的过程 【2】TCP的四次挥手  ----  TCP会话的断开 注意: 三次握手的过程 :         通信双方发送请求序列号,并且确认收到序列号的过程 第一次握手 :      

    2024年02月14日
    浏览(42)
  • TCP 的三次握手和四次挥手

    Java 面试题 第一次握手 :客户端向服务端发送SYN包。报文中标志位SYN=1,序列号seq=x(x为随机整数)。此时客户端进入了  SYN_SEND 同步已发送状态。 第二次握手 :服务端回复客户端SYN+ACK包。报文中标志位SYN=1,标志位ACK=1,序列号seq=y(y为随机整数),确认号ack=x+1(x为客户

    2024年01月20日
    浏览(52)
  • TCP的三次握手和四次挥手

    既然我们文章要说的是TCP的三次握手,和四次挥手,那么肯定是说的连接,也不是说的不其他的。那么它这个连接的过程说的是什么呢? 我们还是从图中理解,这样比较好理解, TCP第一次握手:服务端的TCP进程先创建传输控制块TCB,准备接受客户端进程的连接请求,然后服

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包