分享

为什么初始化一个TCP连接会发这么多SYN?

 昵称11935121 2018-10-03

不邀自来,专业问题我来回答一下:

首先需要明确的是TCP建立连接的三次握手(也就是题主所述的TCP初始化)只有两个SYN,分别是第一次客户端向服务端发起连接请求时SYN和第二次服务端发送SYN确认包给服务端。

背景

  • TCP含义:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的,可靠的,基于字节流的传输协议,它位于OSI模型的传输层,传输层是提供能端到端的通信服务,位于同一层的传输协议还有UDP协议;

  • 面向连接的解释:面向连接指的是在TCP建立通信之前,会通过三次握手(three-way handshake),在握手过程中通过确认序号,定时重传,协商发送数据的窗口大小,数据校验等机制来为可靠的传输服务提供保障。

什么是SYN,SYN的用途是什么

要知道SYN是什么,那就必须要了解TCP的首部字段,TCP首部字段如下图:

  • 源端口号/目的端口号:16位的源端口和目的端口号用于发送端和接受端的进程寻址(像QQ,微信,百度等不同的应用程序),它和网络层的IP(源IP/目的IP)唯一的确认一个TCP连接。

  • 序列号(Sequence Number):32位的序列号用于标识发送的数据字节流在该报文中的第一个数据字节,当顺序号超过2^32 - 1后重新从0开始

  • 确认号:当ACK为1(表明该数据包是一个确认包)是有效,当ack=y时表明对方已经成功收到收到前y-1字节的数据。

  • 首部长度:用来支出报文段数据距离报文段起始位置的距离,单位为字节,其实就是表明TCP报文头的长度

  • 保留域:保留以便以后使用,目前全为0.

  • URG:URG和紧急指针配合使用,当URG=1时,表明紧急字段有效,告诉系统此报文中有紧急数据,应尽快传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。

  • ACK:确认号标志位,当ACK为1时,表明此数据包时一个确认包,一般会返回ack号给对方。

  • PSH:当PSH为1时表明应尽快的将报文交付给应用层来处理,而不用等将缓存区填满后再交付,以便为后续数据腾出空间。

  • RST:RST为1时表明TCP建联出现严重问题,必须释放当前连接,重新建联。

  • SYN:当SYN为1时,表明此数据包是一个同步包,用来表明正在请求连接。

  • FIN:当FIN为1时表明数据已经发送完毕,要断开TCP连接

  • 窗口大小:窗口大小主要用于TCP流量控制,是接收方给发送方确定发送数据的大小的依据。

  • TCP校验和:用来校验数据的完整性,以防被篡改,该字段占2个字节,包含头部和数据两部分。

  • 紧急指针:该字段只有在URG=1时才有效。它指出紧急数据在当前报文段的字节数,它是一个正的偏移量,因此这个字段也相当于紧急指针相对于当前序号的偏移。

  • 选项:长度可变,最长40字节,当没有该字段时,TCP首部字段的长度是20字节。

为什是两次SYN

由前面TCP头部字段的学习,可知SYN=1表明该数据包发起请求建立TCP连接,在TCP建立一个可靠的连接时只有三次握手,前两次客户端和服务端分别发起一起连接请求,最后一次握手是客户端发给服务端的确认数据包,表明已经建立连接,后面就可以发送接收数据了。

第一次握手:SYN=1,表明客户端主动发起连接的请求,同时将序列号为seq=x的包发送给服务端,此时发送端进入SYN_SENT状态。

第二次握手:SYN=1,表明服务器发起一个连接请求,同时ACK=1,表明次数据包对之前服务端的接受进行确认,ack=x+1,标识序号为x的包接受成功。

第三次握手:ACK=1,由客户端对第二次握手的状态进行一个确认,确认没问题TCP就建链成功,可以发送数据。

通过抓包来验证只有两次SYN

综上,TCP在建立可靠连接的三次握手中,仅有前两次有SYN标记,倒是为了数据传输中序号确认,AK标记有很多次。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多