前言
本文是对TCP/IP协议的简要介绍,为后续介绍LWIP做铺垫。LWIP是嵌入式中最常用的TCP/IP协议栈,对其进行介绍和使用前需要对计算机体系结构有大致的理解。
网络协议
首先需要理解协议的含义,网络协议是计算机网络中的一种规则和约定,它们定义了数据通信的方式和数据交换的规则,以确保不同计算机和设备之间可以有效地通信和协作。
网络协议主要由三元素组成:
- 语法:即数据与控制信息的结构或格式
- 语义:即需要发出的某种控制信息,完成何种动作以及做出何种响应
- 同步:即事件实现顺序的详细说明
体系结构
计算机网络各层协议的集合就是网络的体系结构,体系结构的抽象的。网络分层后每一层都是相互独立的,某一层无须关心下一层的视线,只需要知道层间的接口服务,这样的设计使得整个结构灵活可变易于维护,并且各层能使用最适合的技术进行实现。
一、计算机体系结构
- OSI的7层体系结构是理论比较完整的,但是复杂并不实用
- TCP/IP的4层体系结构是Internet互联网最基本的协议,其在一定程度上参考了七层ISO模型。
二、TCP/IP的体系结构
TCP/IP的体系结构分为4层:应用层,运输层,网络层,网络接口层
- 应用层:应用层是TCP/IP协议栈的最高层,它直接与应用程序交互,该层定义的是进程间的通信交互规则。这一层包括各种应用层协议,如HTTP(用于Web通信)、SMTP(用于电子邮件)、FTP(用于文件传输),DNS(域名解析)等等。
- 运输层:传输层负责端到端的通信,主要解决数据的可靠传输、流量控制和错误检测等问题。在TCP/IP协议中,两个最常见的传输层协议是TCP和UDP。TCP提供可靠的、面向连接的通信,而UDP提供无连接的通信,更适合实时性要求较高但不需要可靠性的应用。
- 网络层:网络层负责数据包的路由和转发,它定义了如何在不同的网络之间传输数据,以及如何将数据包从源地址传递到目标地址。主要的网络层协议是IP(Internet Protocol)。IP协议使用IP地址来标识网络上的设备,并通过路由来选择正确的路径将数据包从发送方传递到接收方。
- 网络接口层:链路层是最底层的层次,它与物理层(硬件设备和传输媒介)密切相关。链路层负责数据帧的传输、物理介质的访问以及硬件设备的寻址。链路层包括各种协议,如以太网(Ethernet)、Wi-Fi、PPP(Point-to-Point Protocol)等。
当设备的网卡接收到某个数据包后,它会将其放置在网卡的接收缓存中,并告知TCP/IP内核。然后TCP/IP内核就开始工作了,它会将数据包从接收缓存中取出,并逐层解析数据包中的协议首部信息,并最终将数据交给某个应用程序。数据的接收过程与发送过程正好相反,可以概括为TCP/IP的各层协议对数据进行解析的过程。
TCP/IP协议栈各层的报文封装
二、TCP/UDP协议介绍
TCP/IP可以为各种各样的应用提供服务,但无论是针对什么样的服务和接口运输层和网络层的TCP/UDP和IP协议都是不变的,接下来将详细介绍TCP/UDP协议。
TCP
1、TCP特点
TCP(Transmission Control Protocol,传输控制协议)是计算机网络中的一种通信协议,它属于TCP/IP协议套件的一部分,用于在网络上可靠地传输数据。TCP是一种可靠的协议,它确保数据从发送方到接收方的可靠传输。
1.可靠性:TCP是一种可靠的协议,它确保数据从发送方到接收方的可靠传输。为了实现这一点,TCP使用了以下机制:
- 序号和确认:每个TCP数据包都有一个唯一的序号,接收方会发送确认消息来确认已收到的数据包。如果发送方没有收到确认,它会重新发送数据包,直到确认为止。
- 超时和重传:TCP监测数据包的发送情况,并在超时后重新发送未确认的数据包,以确保数据的完整性。
流量控制:TCP使用窗口机制来控制数据的发送速率,避免发送方过快地发送数据,导致接收方无法处理。 - 有序性:TCP保证数据包按照发送的顺序到达接收端,并且按照相同的顺序交付给应用程序。这意味着即使数据包在传输过程中出现乱序,TCP会对它们进行重新排序,以确保应用程序接收到正确的数据。
2 . 面向连接:TCP是一种面向连接的协议,通信双方在传输数据之前需要建立连接,这包括三次握手过程,用于初始化连接参数。连接建立后,数据的传输是可靠的,连接终止时还需要进行四次挥手来优雅地关闭连接。
3. 全双工通信:TCP支持全双工通信,允许双方同时发送和接收数据。这使得TCP非常适合用于需要双向通信的应用,例如Web浏览器和Web服务器之间的通信。
4. 面向字节流:TCP是面向字节流的协议,它不关心应用程序发送的消息边界,而是将数据视为连续的字节流进行传输。这允许应用程序以灵活的方式发送和接收数据。
5. 拥塞控制:TCP还具有拥塞控制机制,用于避免网络拥塞和过度负载。通过监测网络的拥塞情况,TCP可以动态调整发送速率,以降低拥塞的可能性。
2、TCP帧结构
前20个字节是固定的,后面有4n个字节是根据需而增加的选项,所以TCP首部最小长度为20字节。TCP是根据对方给出的窗口值和当前网络拥塞的程度去决定一个报文段应该包含多少字节。
3、TCP建立
TCP头部的一些常用字段。
- 序号:seq,占32位,用来标识从发送端到接收端发送的字节流。
- 确认号:ack,占32位,期望收到对方下一个报文段的第一个数据字节的序号,ack=seq+1。
- 标志位: SYN:发起一个新连接。 FIN:释放一个连接。 ACK:确认序号有效。
TCP建立连接的过程称为握手,握手需要在客户端和服务器之间交换三个TCP报文段。
三次报文握手
- 第一次报文:客户端向服务端发起建立连接请求,客户端会生成初始起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1,序列号seq=x。第一次握手后客户端的状态为SYN-SENT,此时服务端的状态为LISTEN。TCP规定标志位SYN=1不能携带数据但是需要消耗一个序号。
- 第二次报文::服务端在收到客户端发来的报文后,会生成一个服务端的起始序列号y,然后给客户端回复一段报文,其中包括标志位SYN=1,ACK=1,序列号seq=y,确认号ack=x+1。第二次握手后服务端的状态为SYN-RCVD,此时客户端的状态为SYN-SENT。(其中SYN=1表示要和客户端建立一个连接,ACK=1表示确认序号有效)
- 第三次报文::客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位ACK=1,序列号seq=x+1,确认号ack=y+1。第三次握手后客户端和服务端的状态都为ESTABLISHED。
4、TCP释放
四次报文握手
- 第一次报文::客户端向服务端发送的数据完成后,向服务端发起释放连接报文,报文包含标志位FIN=1,序列号seq=u。此时客户端只能接收数据,不能向服务端发送数据。
- 第二次报文::服务端收到客户端的释放连接报文后,向客户端发送确认报文,包含标志位ACK=1,序列号seq=v,确认号ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能向服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。
- 第三次报文::服务端发送完数据后向客户端发出连接释放报文,报文包含标志位FIN=1,标志位ACK=1,序列号seq=w,确认号ack=u+1。
- 第四次报文::客户端收到服务端发送的释放连接请求,向服务端发送确认报文,包含标志位ACK=1,序列号seq=u+1,确认号ack=w+1。
为什么需要等待计时器?
- 保证客服端的最后一个报文可以成功到达服务器端。
- 防止已失效的报文出现在连接中。
- 除了等待计时器,TCP还包含保活计时器,如果客户端出故障服务器会等待后发送探针确认客户端状态。
UDP
1、UDP帧结构
UDP的首部只有8个字节,源端口号、目的端口号、长度和校验和各两个字节。UDP发送的报文长度是由应用进程给出的。
2、UDP传输过程
参考资料
TCP与UDP有什么区别
《计算机网络(第七版)》谢希仁
UDP传输