前言
首先先说明一下TCP/IP是协议簇,不是一个单一的协议 ,TCP/IP的协议包含http,tftp,tcp,ip等一堆协议,作为一个嵌入式开发人员,我对自己的要求是能够理解基本的三次握手四次挥手流程,能进行wireshark抓包分析,能写基础的socket套接字代码进行数据通信流程即可。在嵌入式上除了物联网之类的设备或者通信相关可以插网线的设备,大部分设备都是单机脱网的。
想要深入理解TCP/IP协议还得参考圣经:<TCP/IP协议详解>
这本书很厚,非常厚,超级厚,分三卷,适合从事网络安全之类工作的去详细学习,真的写的非常好。
一、TCP/IP协议是什么?
TCP/IP是协议簇,包含多种协议,不同层对应一系列的协议
tcp/ip | 协议 |
---|---|
应用层 | http,ftp,tftp,snmp等 |
传输层 | tcp,udp |
网络层 | ip,icmp,arp等 |
网络接口层 | 802.3,802.11 |
常见的网络通信模型和TCP/IP模型的对应关系如下图TCP/IP协议簇一共四层,我们常用的TCP协议在传输层,IP协议在网络层
二、TCP三次握手和四次挥手流程
经典的三次挥手和四次握手流程,这个应该是每一个嵌入式程序员都应该了解的,这里我做简单的科普类说明。
首先先简单了解一下TCP头部的数据格式,这里需要理解下标黄的部分,不然无法明白握手过程如何建立连接的。
序列号:seq占4字节
确认应答号:ack占4字节
控制位(优先关注标黄的):URG、ACK、PSH、RST、SYN、FIN
1.TCP三次握手
三次握手本质上是为了确保连接的有效性,确保连接是及时的,client发送server连接请求,server返回ACK确认信号,这个时候其实服务端到客户端的连接已经建立了,但是如果这个时候就开始发送数据可能是有误的,这个时候client发送的连接请求可能有误网络延时已经失效了,只有client再次发送ACK确认才能保证连接是及时有效的。所以有下面的连接时序图。
- 客户机发送SYN = 1表示建立连接,seq = x为当前的客户机的序列号
- 服务器监听函数收到信号后会告诉客户机收到了发送ACK = 1,ack = x+ 1,这个ack表示对客户机这个序列号为x的请求的应答,所以在他上面加上了一个1,同时会发送另一个序号seq = y到客户机上
- 客户机收到ACK后会发送x+1的序号,再返回ack = y +1给服务器
- 这个时候可以看到,建立连接后客户机的seq序号为 x + 1,此时如果客户机向服务端发送消息的话seq序号为x + 2
建议:最简单的理解TCP流程的方法就是进行一次wireshark抓包,对包逐句分析很快就能理解seq的含义,以及为什么会有大ACK和小ACK
2.四次挥手
明天再总结,今天到此结束。。。。