引言
net
github
starissue
TCP介绍
特点
- 面向连接的运输层协议。在应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
- TCP提供可靠交付的服务。 通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
- TCP提供全双工通信。 TCP允许通信双方的应用进程在任何时候都能发送数据。
- 面向字节流。 TCP的流是指流入到进程或从进程流出的字节序列。虽然应用程序和TCP的交互式一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
图解
- TCP结构
- TCP连接
TCP 连接建立,三次握手
传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。
LISTEN
SYN=1seq=xSYN报文段SYN=1SYNAVK1ack+1ACKack=y+1seq=x+1seq=x+1
这时候TCP已经建立了。A进行入了已经建立连接的阶段状态。B收到确认后也进入了连接状态。
TCP 连接释放,四次挥手
ESTABLISHED
FIN1seq=u1FIN-WAIT-1(终止等待1)
注意:TCP规定,FIN报文段即使不携带数据,他也消耗掉一个序号!!
ack = u + 1v最后一个字节的序号加1CLOSE-WAIT(关闭等待)FIN-WAIT-2(终止等待2)FIN = 1wack = u + 1LAST-ACK(最后确认)ACK置1ack=w+1seq=u+1TIME-WAIT还没有还没有释放掉2MSL
时间MSL叫做最长报文段寿命,RFC793建议设在两分钟。但是在现在工程来看两分钟太长了,所以TCP允许不同的实现可以根据具体情况使用更小的MSL值。
代码实现
clientserver
1. 连接
1.1 服务端
- 监听连接
netListen
1.2 客户端
- 建立连接
netDail
2. 通信
2.1 服务端
- 接受信息
.Read
2.2 客户端
- 发送信息
.Write
3. 回复
当服务端收到信息之后,应该返回信息给客户端。表示已经收到了数据。
3.1 服务端
服务端回复信息
3.2 客户端
客户端收到信息