本文的写作目的:一是把TCP老生常谈的点拎出来大体上看看,从握手和状态机到码农最常使用的TCP API;二是给后续的系列文章打个头儿,没错,后面会深入到每个API内部一探究竟;三是不求浮光掠影只望雁过留痕;四是最近比较烦,码码字散散心。
如果内容有Bug,请一定高调指出来,咱们携手干它。
声明:下文中这么好看的图,我画不出来,直接搬来啦。详情请参考图片下方的图片来源。
目录
Handshake
废话不说,直接上图:
![TCP Handshake](https://i-blog.csdnimg.cn/blog_migrate/99d009841f974e10979c0ffa09ac1e5a.jpeg)
图瞪了半天也没觉得有什么好说的,这个是 TCP 建立连接和断开连接的标准过程。唯一想多说的是,每个 SYN 包和 FIN 包是需要占用一个 SN (sequence num) 的,ACK 包则不占用。至于初始 SN 是怎么得来的,暂且不谈。
State-machine
状态机表示当前连接所处的阶段,对应上图中的 SYN_SENT、LISTEN、ESTABLISHED 等,上图:
![State-machine](https://i-blog.csdnimg.cn/blog_migrate/b170e0e2df654b7373c0a5edb50a1095.png)
标准状态机,建议从上到下再到上跟着流程走上几遍。
API
列几个常用的 API,供后续文章解剖。
Client | Server |
lwip_socket(a,b,c) lwip_connect(a,b,c)
lwip_select(a,b,c,d,e) lwip_send(a,b,c,d) lwip_recv(a,b,c,d)
lwip_shutdown(a,b) | lwip_socket(a,b,c) lwip_bind(a,b,c) lwip_listen(a,b) lwip_accept(a,b,c)
lwip_select(a,b,c,d,e) lwip_send(a,b,c,d) lwip_recv(a,b,c,d)
lwip_shutdown(a,b) |