TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编程的角度来说,UDP编程也要简单的多----UDP都不用考虑数据分片。
书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程,可以看到,TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。
1.连接的建立
在建立连接的时候,客户端首先向服务器申请打开某一个端口(用SYN段等于1的TCP报文),然后服务器端发回一个ACK报文通知客户端请求报文收到,客户端收到确认报文以后再次发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此,连接的建立完成。这就叫做三次握手。如果打算让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。
可以想见,如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个数据包被送到目的地。
2.结束连接
TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。
3.最大报文长度
在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),以便通信。一般这个SYN长度是MTU减去固定IP首部和TCP首部长度。对于一个以太网,一般可以达到1460字节。当然如果对于非本地的IP,这个MSS可能就只有536字节,而且,如果中间的传输网络的MSS更佳的小的话,这个值还会变得更小。
4.TCP的状态迁移图
书P182页给出了TCP的状态图,这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移,如果从某一个角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。
4.1.客户端应用程序的状态迁移图
客户端的状态可以用如下的流程来表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。
4.2.服务器的状态迁移图
服务器的状态可以用如下的流程来表示:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。
4.3.其他状态迁移
书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下
- LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
- SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED
- SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。
- SYN_收到->LISTEN,如果受到RST包,会返回到LISTEN状态。
- SYN_收到->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。
4.4.2MSL等待状态
书中给的图里面,有一个TIME_WAIT等待状态,这个状态又叫做2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报以后,要进入TIME_WAIT状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)。这个状态在很大程度上保证了双方都可以正常结束,但是,问题也来了。
由于插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好一些,但是对于服务程序,例如httpd,它总是要使用同一个端口来进行服务,而在2MSL时间内,启动httpd就会出现错误(插口被使用)。为了避免这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。
4.5.FIN_WAIT_2状态
这就是著名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态。在这个状态下,应用程序还有接受数据的能力,但是已经无法发送数据,但是也有一种可能是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。
5.RST,同时打开和同时关闭
RST是另一种关闭连接的方式,应用程序应该可以判断RST包的真实性,即是否为异常中止。而同时打开和同时关闭则是两种特殊的TCP状态,发生的概率很小。
6.TCP服务器设计
前面曾经讲述过UDP的服务器设计,可以发现UDP的服务器完全不需要所谓的并发机制,它只要建立一个数据输入队列就可以。但是TCP不同,TCP服务器对于每一个连接都需要建立一个独立的进程(或者是轻量级的,线程),来保证对话的独立性。所以TCP服务器是并发的。而且TCP还需要配备一个呼入连接请求队列(UDP服务器也同样不需要),来为每一个连接请求建立对话进程,这也就是为什么各种TCP服务器都有一个最大连接数的原因。而根据源主机的IP和端口号码,服务器可以很轻松的区别出不同的会话,来进行数据的分发。
相关推荐
### TCP状态机详解 #### 一、引言 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本文旨在深入解析TCP状态机的工作原理及其背后的逻辑,以便读者能够更好地理解和...
### TCP有限状态机详解 #### 一、引言 TCP(传输控制协议)是一种面向连接的、可靠...了解TCP状态机对于理解TCP协议的工作原理至关重要,尤其对于网络工程师而言,掌握这些基础知识对于解决实际网络问题非常有帮助。
总结来说,状态模式在TCP连接案例中的应用展示了如何利用设计模式来管理复杂对象的行为变化。通过将TCP连接的不同阶段抽象为独立的状态类,我们可以更好地组织代码,提高代码的可读性和可扩展性。`StateTest`文件...
在计算机网络领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种最基础且重要的传输层协议。它们负责在互联网上可靠地或高效地传输数据。本篇文章将结合提供的文件名称,深入探讨TCP/UDP编程的核心知识点,...
TCP(Transmission Control Protocol)是一种...总结来说,TCP状态转换图展示了TCP连接生命周期中的各种状态变化,这些状态确保了连接的可靠性,以及数据的准确传输。理解这些状态对于理解和调试网络连接问题至关重要。
Wireshark 分析 TCP 连接断开过程分析与总结 Wireshark 是一个功能强大的网络协议分析工具,能够对 TCP 连接断开过程进行详细的分析和总结。下面我们将对 Wireshark 分析 TCP 连接断开过程进行详细的分析和总结。 ...
下面我们将详细探讨TCP状态转换的各个阶段。 1. **CLOSED**: 这是TCP连接的初始和最终状态,表示连接未建立或已关闭。 2. **LISTEN**: 当一个TCP端点准备接受来自其他端点的连接请求时,它进入LISTEN状态。在这个...
### TCP/IP协议知识点总结与面试 #### 一、TCP/IP整体认知 TCP/IP协议栈是互联网的核心协议之一,由四个主要层次组成:应用层、传输层、网络层和链路层。TCP/IP协议栈不仅定义了如何封装和解封装数据,还定义了...
下面将对TCP和UDP的详细知识点进行归纳总结。 ### TCP协议知识点 1. **TCP/IP协议族成员**: TCP/IP并不只是指TCP和IP两种协议,它是一系列网络协议的统称,这些协议共同构成了互联网的基础。除了TCP和IP,还包括...
例如,通过Modbus/TCP协议,可以实时监控机器状态、调整参数设置等,从而提高生产效率和产品质量。 #### 2. **能源管理** 在能源管理系统中,Modbus/TCP同样发挥了重要作用。比如,在智能电网中,昆仑通态的设备...
### TCP/IP与Socket总结 #### 一、TCP/IP概述 **TCP/IP**(Transmission Control Protocol/Internet Protocol)是一组用于互联网及其相关网络的基础协议。它由一系列协议组成,旨在为不同类型的计算机网络提供通用...
总结来说,"TCP客户端和服务器端模拟器"是一个宝贵的工具,它提供了源代码和演示程序,帮助我们掌握TCP网络编程。无论是对TCP协议的理解,还是对实际应用的开发,都能从中受益匪浅。通过分析源代码,我们可以学习到...
总结来说,`TcpListener`在C#中是构建TCP服务器的核心,配合`TcpClient`可以实现客户端和服务器间的双向通信。TCP监控则关注服务器的运行状况,包括连接状态、错误处理和日志记录,确保服务的稳定性和高效性。通过...
总结起来,实现STM32F407上的EC20状态机代码,涉及的关键技术包括EC20模块的AT命令控制、TCP连接管理、GPS数据解析、以及CAN通信。通过这一系列步骤,我们可以构建一个可靠的数据传输系统,将GPS信息实时地从STM32F...
2. **三次握手过程**:建立TCP连接时,客户端和服务端之间通过三次握手过程来同步状态信息,包括序号和确认号。这一过程确保了连接的可靠性。 3. **序列号与确认号**:每个TCP数据包都包含了序号和确认号字段,用于...
实验结果分析部分,可以看到源IP和目标IP之间的TCP通信,以及对应的TCP标志位(如SYN、ACK),这些标志位用于控制连接状态和数据传输。通过Wireshark的捕获,可以直观地理解TCP和FTP协议在实际网络通信中的运作方式...
15关于监控k8s集群经验总结以及监控容器的tcp连接数
总结,ModbusTCP是工业控制领域的重要通信协议,而PC端的测试工具,如"ModbusTCP_Master V2.0",是调试和验证ModbusTCP设备的关键工具。了解和掌握这类工具的使用方法,能够极大地提升开发效率,保证系统的稳定性和...
收敛性则是指在面对网络状态变化时,TCP协议能够快速调整其行为以适应新的网络状况。 #### 三、TCP协议优化的关键思路 针对TCP协议的现状及存在的问题,以下是一些关键的优化思路: - **慢启动优化**:传统慢启动...