当前位置:文档之家› RT-Thread LWIP协议栈之TCP学习

RT-Thread LWIP协议栈之TCP学习

RT-Thread LWIP协议栈
TCP协议
基本TCP服务器--客户端程序设计
socket() connect() socket() bind() listen(lis_fd) ccfd=accept()
send()
阻塞等客 户端连接 recv(ccfd) recv() 处理请求 close()
send(ccfd)
lwIP中和TCP相关的选项
● MSS(Maxsimum Segment Size) #define TCP_MSS 536
● Send Buffer #define TCP_SND_BUF (2 * MSS)
● TCP Window #define TCP_WND
(4 * MSS)
TCP链路应用 :: 发送超时
TCP::发送序号
参考文献
❖ TCP连接建立和断开
❏ TCP协议 TCP程序只能调用一次connect。
TCP三次握手
➔ TCP提供可靠的连接服务,并采用三次握手建立一个连 接。 ➔ TCP首部中有6bit标志位,分别为6种标示: ○ SYN (synchronous同步,开始建立连接) ○ ACK (acknowledgement 确认) ○ PSH (push报文尽快传送) ○ FIN (finish结束) ○ RST (reset重置连接) ○ URG (urgent紧急) ➢ 第一次握手:主机A(客户端)发送SYN=1,序列号为随 机值的一个数据包给主机B(服务器) ➢ 第二次握手:主机B收到A发来的SYN数据包,回发一个
客户端 服务器端
半关闭
全关闭 TCP连接 断开
TCP数据在LwIP中数据流向
lwip_send() netconn_write_partly() 回调do_write() do_writemore() tcp_write() tcp_output() etharp_send_ip() 或 etharp_query()
TCP网络编程主要的Socket API
❏ lwip_socket() ❏ lwip_bind() ❏ lwip_listen() ❏ lwip_accept() ❏ lwip_send() ❏ lwip_recv() ❏ lwip_close()
socket 编程你需要了解的
➢ socket
一个socket由一个五元组来表示(协议,server_ip, server_port, client_ip, client_port),只要任一值不同则 代表不同的socket。
TCP链路应用 :: 接收超时
TCP链路应用 :: 保活
TCP::发送序号

• • •
网络包在网络中允许乱序传输,序号用于确 保发送、接收的序列;
第1步:客户端向服务器发送一个同步数据包请求建立连 接,该数据包中,初始序列号(ISN)是客户端随机产生 的一个值,确认号是0; 第2步:服务器收到这个同步请求数据包后,会对客户端 进行一个同步确认。这个数据包中,序列号(ISN)是服 务器随机产生的一个值,确认号是客户端的初始序列号 +1; 第3步:客户端收到这个同步确认数据包后,再对服务器 进行一个确认。该数据包中,序列号是上一个同步请求 数据包中的确认号值,确认号是服务器的初始序列号+1 。
● ● ● ●
bind accept connect closesocket
指明本地IP地址和端口
加入客户端二元组(ip,port)
指明远端IP地址和端口 调用方断开连接,不再发送数据
connect的那些事儿
❏ UDP协议 在UDP程序创建套接字后,它便可以与多个服务 器通信;当然也可以使用connect指定对方的 IP地址、端口。 UDP程序无三次握手,可多次调用connect。
ethernetif_linkoutput()
回调 netif->linkoutput()
tcp_output_segment() ip_route() ip_output()
etharp_output( )
回调
ip_output_()
TCP状态机
TCP滑动窗
TCP拥塞控制算法
三次握手图解
主机A 客户端 主机B 服务器
TCP建立的连接
TCP经过三次握手后建立起连接,该连接的数据 流是双工的。
主机A 写 主机B 读


我们称此为TCP连接对。
关闭连接
■ 当客户端调用close主动关闭连接时,此时只 是关闭TCP连接对中的客户端的写通道,此 时的状态称之为半关闭。依然能接收来自服 务器的数据。
相关主题