TCP 协议在 STM32 上的移植
from
http://blog.csdn.net/xukai871105/article/details/37729201 2014-07-12 1.前言
【由于TCP协议负载,若有说的不对的地方,请及时指出,第一时间改正。本博文2013年2月在某论坛发表,现搬迁至CSDN博客】
从实用主义的角度出发,学习嵌入式TCPIP可以直接从本章节开始学习,甚至可以直接从HTTP开始学习。我也曾经是一个现实的实用主义者, 以为有了AVRNET项目的源码,修改移植之后便可以用于STM32。但是现实总是那么残酷,对于一个还不熟悉HTML元素,没有任何PHP和SOCKET编程知识的我来说,修改AVRNET的任何一行代码都是不可能完成的任务,我几乎不知道修改这行代码造成哪些变化。但是通过不断地学习情况有所好转,这些学习包括HTML,CSS,JaveScript,PHP,MySQL,SOCKET等。通过这些学习与积累慢慢地揭开了TCPIP的面纱,而通过TCP让STM32返回Hello是多么令人兴奋的事情。
本文将通过分析和整理AVRNET项目源码并移植到STM32平台中,实现TCP部分内容,通过TCP打印Hello和LED控制实例说明TCP的使用方法。
TCP协议是是一个非常复杂的协议,本文并不会实现TCP的方方面面,毫不避讳的说本文所用TCP是不完整的TCP,没有TCP坚持定时器和TCP重发功能,更别提滑动窗口功能,TCP的传输速度也低的可怜。本文试图通过最简单的代码实现最基本的TCP功能,这些包括TCP建立,TCP数据包发送,TCP关闭连接。
【 STM32NET学习笔记——索引】
【代码仓库】——请以代码仓库中的内容为主。1.2 相关资料
【ENC28J60学习笔记】 【AVRNET项目(国外) 】
【AVR webserver项目(国外) 】1.3 学习路线建议 本文仅仅简单的说明TCP使用的方法,通过一个TCP发射的例子积累学习嵌入式网络应用的信心,但是这些知识是远远不够的,你还需要学习以下知识。这些知识将帮助你设计和实现嵌入式网页,设计优美的嵌入式web类型的API。 【HTML】先学习HTML4,再学习HTML5 【CSS】先学习CSS2,再学习CSS3 【Javascript】
【JSON】强烈建议学习JSON格式和应用方法。 【JQuery】建议先熟悉Javascript,再学习JQuery。 【PHP】和PHP工程师不同,更多关注HTTP部分内容。 【数据库】学习一款数据库,可以是MySQL或SQLite,熟悉基本操作增删改查。
【Linux】更多关注应用层设计,如果你不介意尝试一下树莓派吧。
【RESTFul】学习该框架,了解如何设计HTTP API。 【等等】知识真的是够多的,请您保持耐心。
1.4 其他说明
【PC IP】192.168.1.101 【STM32 IP】192.168.1.15 【TCP端口号】3001
2.TCP协议简述
本小节仅介绍TCP如何建立连接,发送数据和终止连接的技巧,本文将不详细讲述TCP首部中的各种字节含义,因为你可以找到很多说明的图书。 更多基础内容请参考。 【1】《TCP IP详解 卷1》 机械工程出版社出版 【2】《嵌入式Internet TCP IP基础、实现及应用》 北京航空航天出版社
2.1 TCP的建立和终止
在STM32NET项目中暂假定PC机为客户端,STM32为服务器端。在这种情况下,有PC机发起连接,STM32被动的处理整个TCP过程。
【1】PC机试图建立连接,发出SYN标志。
【2】STM32接收到SYN标志,响应PC机的连接请求,发送SYN和ACK标志
【3】PC机收到SYN和ACK标志,发送ACK标志,表示TCP连接建立
【4】PC机在建立连接之后,向STM32发送TCP负载数据,并包含PUSH和ACK标志
【5】STM32收到负载数据,返回应答数据,并包括FIN、ACK和FUSH标志(FIN意味着AVR试图停止本次TCP连接)
【6】PC机对负载数据处理,返回ACK标志
【7】PC机也发出FIN标志和ACK标志,同意停止本次TCP连接
【8】STM32收到该FIN标志,发出ACK标志,意味着本次TCP通信完全结束。
TCP的建立连接,收发数据和停止连接,配合定时器辅
以有限状态机是一个常用的实现方式,但实现这些功能需要成千上万行代码,通过分析可以看出。
【1】对于FIN标志和SYN标志,无论是服务端还是客户端都需要发送ACK标志
【2】STM32共4次收到ACK标志。第一次为上文的第3步,该ACK位的接收表示TCP连接成功,此时负载数据长度为0,STM32对该返回报文不做处理。第二次收到ACK标志,发生在上文的4到5步,和上次收到ACK不同,负载数据一定不为0。第三次收到ACK标志,发生在第6步,此时负载数据长度也为0,STM32对该报文不做任何处理。第四次收到ACK标志发生在第7步,STM32必须应答,但是该报文也含有FIN标志,可以区别于以上几种情况。 STM32NET项目便采用以上的方式区别TCP数据包,通过IF ELSE实现了TCP状态机。STM32NET项目先处理SYN标志,接着检查所有的ACK标志,若标志也含有FIN标志,则返回ACK,若负载数据长度为0,不做响应,若负载数据大于0,取出数据做出合适的响应。
2.2 TCP序号和确认号
TCP序号和确认号也是一个比较微妙的细节。总结起来有以下几点。