Python网络编程9-实现TCP三次握手与四次挥手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python网络编程9-实现TCP三次握手与四次挥手相关的知识,希望对你有一定的参考价值。

参考技术A    见TCP流量分析篇
   TCP 流量分析 - (jianshu.com)

  使用一台windows主机作为TCP Server,使用一台Linux作为TCP Client,发起TCP连接,发送数据,结束连接。

  以下Python脚本通过Socket实现TCP Server端,接收TCP连接。

  以下Python脚本通过Scapy实现TCP Client端,向Server端发起TCP连接。

  首先在Windows主机上运行TCP Server脚本。

  在linux主机上运行TCP Client脚本后,会将TCP交互过程打印出来。

  通过科来的csna抓包,并追踪TCP流,如下为交互的数据包

网络编程:TCP/IP协议的三次握手与四次挥手

四次挥手下次在说,篇幅太长也不爱看

搞懂三次握手,有问题留言,小编解答

网络时代,网络编程怎么可以缺席!我们通常使用的网络模型是位于OSI(七层)模型和TCP/IP(四层)模型之间的五层模型(应用层,传输层,网络层,数据链路层,物理层),我们使用套接字来实现端到端(即进程到进程)任务


而这“握手”和“挥手”位于传输层,传输层主要有TCP协议和UDP协议

我们知道,TCP协议有建立连接,传输数据,释放连接三个阶段。


网络编程:TCP/IP协议的三次握手与四次挥手
TCP连接建立,分三步骤,即 三次握手

网络编程:TCP/IP协议的三次握手与四次挥手

此为C/S模式,即Client/Server

(1)“唤醒服务器”作用:客户机(Host)的TCP向服务器(Server)TCP连接发送请求报文段,让Host端和Server端达到同步,即要使该报文段中SYN(同步位,Synchronize)标志位置为1。此外,客户端会选择一个起始序号seq(sequence)=x,即从哪开始


(2)”服务器端准备“作用:Server的TCP收到连接请求报文后,如同意连接,则回复确认,并为该TCP连接分配TCP缓存和相关变量。在确认报文中,SYN和ACK位都置为1,确认号字段为x+1,且随机产生服务器的起始序号seq=y,即从哪开始

注意:确认号ack是对收到客户机的报文进行确认,另一层含义表示期望收到下一个报文的序号


(3)”客户端准备“作用:当客户机收到(2)中确认报文段后,还要向服务器给出确认。同时,客户端也为该TCP连接分配缓存和变量。这个报文段中ACK标志。

注意:ACK位置1,序号字段为x+1(从上面x开始的),确认号为ack=y+1与ack都是确认号,但是不同,ACK表示只有ACK=1时,此报文段才有效,为0表示无效。而ack的作用在(2)注意中


问题:有的人可能会觉得第三次握手没必要,即客户直接分配变量和缓存后可开始传送数据,不必再次确认

我答:我们知道,网络传输随时都有可能丢失数据,而这第三次握手就是为了防止两次握手情况下已经失效的连接请求报文段突然又传送到服务器端(即先滞留在网络中,当重传完成后,又传到)而产生错误。

举例说明:若第一次握手时,Client端的请求连接报文段因为网络问题,滞留在了网络中(假设 滞留时间>传输数据时间),超时后Client端认为其丢失,再次重新发送另一个连接请求报文,Server端收到后建立了连接,传输数据完成后,滞留的请求报文段才达到服务器端,而服务器不知道,便以为客户端要再次建立连接,若此时使用三次握手,连接就会失败;若采用两次握手,服务器便以为已建立了连接,就等待Client端发送数据,而客户端又实际无连接请求,因此不予理睬,这样就造成了资源的浪费。


以上是关于Python网络编程9-实现TCP三次握手与四次挥手的主要内容,如果未能解决你的问题,请参考以下文章

网络编程:TCP/IP协议的三次握手与四次挥手

TCP三次握手和四次挥

TCP三次握手和四次挥

TCP协议(数据传输层)的连接过程三次握手四次挥别

TCP三次握手与四次挥手

TCP中三次握手与四次挥手