文章目录

  • 1、网络协议(TCP/IP协议族)
  • TCP/IP四层模型、TCP/IP五层模型、OSI七层模型
  • TCP协议:
  • TCP 三次挥手:
  • 为什么TCP客户端最后还要发送一次确认呢?
  • TCP连接的释放(四次挥手)


1、网络协议(TCP/IP协议族)

网络协议即是为了能让计算机网络进行数据交换而建立的规则、标准;例如下载软件然后如果不同意协议就不能继续下一步,同样的道理在互联网中,如果不遵循互联网协议就不能访问到资源;互联网上有上百种协议,但是最重要的两个协议是TCP/IP协议,因此我们将上百种协议统称为TCP/IP协议族。TCP/IP协议族,根据协议的功能的不同抽象成了4层。

应用层:TFTP(UDP),HTTP(TCP),SNMP,FTP(TCP),SMTP(TCP),DNS(UDP),Telnet(TCP),MYSQL(TCP)等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLTP,PPP,MTU

TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫他的下一层所提供的的网络来完成自己的需求。这4层分别为:
1、应用层:应用层程序间沟通的层,如简单的电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(TeLnet)等

2、传输层在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据报加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
3、互联网络层:负责提供基层的数据封装包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)
4、网络接口层(主机-网络层):接收IP数据包并进行传输,从网络上接收物理帧,抽取IP数据包转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据

TCP/IP四层模型、TCP/IP五层模型、OSI七层模型

python profinet协议 python网络协议解析_服务器

数据传输的时候先将数据从应用层传递到传输层,然后再从传输层传递到网络层,然后再到链路层,最后通过物理传输介质(网线)传递数据,在电脑上传输数据时需要通过一层一层的传输,在传输过程中为了保证数据不丢失,需要在每一层的时候添加一些额外的内容。那每一层都添加了啥嘞!请看下图

python profinet协议 python网络协议解析_python profinet协议_02

TCP协议:

TCP概述:把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫做套接字(socket),它的定义为端口号拼接到IP地址既构成为192.3.4.16而端口号为80.那么得到的套接字为192.3.4.16:80。

TCP报文首部

1、源端口和目的端口,各占2个字节。分别写入源端口和目的端口;

2、序号,占4个字节,TCP连接中传送的字节流中的每一个字节都按顺序编号。例如,一段报文的序号字段值为301,而携带的数据共有100字段。显然下一个报文段(如果还有的话)的数据序号应该从401开始;

3、确认号,占4个字节,是期望是收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的序号700为止的数据。因此,B期望收到A下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;

4、数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远

5、保留,占6位,保留今后使用,但目前应都为0;

6、紧急URG当URG=1,表面紧急指针字段有效。告诉系统此报文段中有紧急数据

7、确认ACK,仅当ACK=1时,确认号字段才有效,TCP规定,在连接建立后所有报文的传输都必须把ACK置为1

8、推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;

9、复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;

10、同步RST,在连接建立时用来同步序号,当SYN=1,ACK=0表明是连接请求报文,如同意连接,则响应报文中应该使SYN=1,ACK=1;

11、终止FIN,用来释放连接,当FIN=1,表明的保温的发送发方的数据已经发送完毕,并且要求释放

12、窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接收

13、检验,校验首部和数据这两部分;

14、紧急指针,占2字节,指出本报文段中的紧急数据的字节数;15、选项,长度可变,定义一些其他的可选参数

三次握手:

python profinet协议 python网络协议解析_服务器_03


四次挥手:

python profinet协议 python网络协议解析_python profinet协议_04

TCP 三次挥手:

python profinet协议 python网络协议解析_客户端_05


1、TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

2、TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

3、TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

4、TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。5、当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

为什么TCP客户端最后还要发送一次确认呢?

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

TCP连接的释放(四次挥手)

python profinet协议 python网络协议解析_python profinet协议_06


数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。