Tcp握手

Tcp: Transmission Control protocol传输控制协议(转载)

      
 Tcp是主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接

位码即标记位,有6种表示:syn(Synchronous)建立联机,ACK(acknowledgement)确认,PSH(push)传送,FIN(finish)结束,RST(rest)重置,URG(urgent)紧急,Seq(sequence number)顺序号,Acknowledgement number确认顺序号。

 第一次握手:主机A发送syn=1,随机参数顺序号seq number=1234567的数据包到服务器,主机B由syn=1知道,A要求建立联机。

第二次握手:主机B收到请求后要确认联机信息,向A发送Ack number=(主机A的seq number+1),syn=1,ack=1,随机产生seq = 7654321。

第三次握手:主机A收到后确认Ack number是否正确,即第一次发送的seq+1,ack=1。若正确,主机A会在发送ack number=(主机B的seq number+1),ack=1,主机B收到seq值与ack=1确认正确,联机成功。

完成3次握手,主机A与主机B开始传送数据。

 

       Tcp/IP采用3次握手建立一个可靠的连接。

第一次握手:建立连接是,客户端发送syn包到服务器(syn=j),并进入syn_send状态,等待服务器确认。

第二次握手:服务器收到syn包,必须回复客户端SYN包的确认Ack包(ack = j +1),同时自己也发送一个SYN包(syn = k),即syn+ack包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到SYN+ACK包,向服务器SYN回复确认Ack包(ack = k+1),此包发送完毕,客户端和服务器进入established状态,完成3次握手。然后客户端和 服务器端进行传输数据。

    

实例:

       IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
       IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
       IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1

       第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到  192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

       第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;

       第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

       
 

     

  

      TCP的断开采用4次握手的机制。

      

       客户端的状态:

       
 

       服务端的状态:

      
 

      
 

      

 

### TCP三次握手过程详解 TCP三次握手是建立可靠连接的关键步骤,以下是其具体过程: #### 第一次握手 客户端发起连接请求,将标志位`SYN`置为1,并随机生成一个初始序列号`seq=J`,然后将此数据包发送至服务器。此时,客户端进入`SYN_SENT`状态,等待服务器的确认[^1]。 ```python # 客户端第一次握手示例 packet = { 'SYN': 1, 'SEQ': J, # 随机生成的初始序列号 } send(packet) ``` #### 第二次握手 服务器接收到客户端的数据包后,通过判断标志位`SYN=1`得知这是连接请求。服务器随即也将自己的`SYN`和`ACK`标志位置为1,同时生成自身的初始序列号`seq=K`,并将确认号设为`ack=J+1`(表示已接收并认可客户端的序列号)。随后,服务器将该数据包返回给客户端,进入`SYN_RCVD`状态[^1]。 ```python # 服务器第二次握手示例 response_packet = { 'SYN': 1, 'ACK': 1, 'SEQ': K, # 服务器的初始序列号 'ACK_NUM': J + 1, # 对客户端序列号的认可 } send(response_packet) ``` #### 第三次握手 客户端接收到服务器的响应后,验证`ack`是否等于`J+1`以及`ACK`是否为1。如果验证无误,则客户端将自己的`ACK`标志位置为1,并将确认号设为`ack=K+1`,以此告知服务器其序列号已被接受。最后,客户端将此数据包发送回服务器,双方均进入`ESTABLISHED`状态,完成三次握手[^1]。 ```python # 客户端第三次握手示例 final_ack_packet = { 'ACK': 1, 'SEQ': J + 1, 'ACK_NUM': K + 1, # 对服务器序列号的认可 } send(final_ack_packet) ``` --- ### 解决与TCP握手相关的问题 在实际应用中,可能会遇到一些与TCP三次握手有关的问题,例如SYN洪泛攻击。这种攻击利用了服务器在收到SYN包后需创建半连接的特点,通过伪造大量不存在的IP地址发送SYN请求,使服务器资源耗尽。为了缓解此类问题,可以通过以下方法优化系统配置: - **缩短超时时间**:减少服务器维持半连接的时间,以便更快释放资源。 - **启用SYN Cookie技术**:无需为每个SYN请求分配内存空间,而是通过计算得出一个加密值作为确认依据[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值