一. TCP协议特点
1.基于连接的: 数据传输之间需要连接
2.全双工: 双向传输
3.字节流: 不限数据大小,打包成报文段, 保证有序接收,重复报文丢弃
4.流量缓冲: 解决双方处理能力的不匹配
5.可靠的传输服务: 保证可达,丢包时,通过重发机制实现可靠性
6.拥塞控制: 防止网络出现恶性拥塞
二. TCP报文格式
源端口(2字节): 发送端应用程序的端口号,与源IP地址确定一个唯一地址
目的端口(2字节):接收端计算机应用程序的端口号,与目的IP地址确定唯一的地址
序号(4字节):TCP是面向字节流传输的,他为每一个字节编了一个序号,该报文段中序号为传输数据第一个字节的序号,例如:一个报文端的数据部分大小为100个字节,他的序号为400,那么下一次报文段的序号就为500
确认号(4个字节):指明了下一个期待接收的字节序号,表明该序号之前的所有字节都正确接收到了,只有当ACK为1的时候确认号才有效
数据偏移/首部长度(4个字节): 用来表示报文段数据的起始处距离报文起始处的长度也就是TCP报文首部的长度,由于首部含有可选项,所以TCP报头长度是不确定的。
保留:为了将来定义新的用途保留,现在一般都置为0
URG紧急控制位:与紧急指针配合使用,当URG为1的时候,就是通知系统这个报文段有紧急数据,需要优先传输。
ACK确认控制位: 当他为1的时候,确认号字段才有效,TCP规定,在连接建立后,所有ACK都应该置为1
PSH推送控制位: 当报文段的psh为1的时候,接收方接到该报文段,就立刻将他交付给接收应用进程,而不是等缓存已满的时候再交付。
RST复位控制位: 当报文段的RST为1的时候,说明该TCP连接出现错误,必须释放连接,并重新建立连接。
SYN同步控制位: 在连接建立时用来同步序列号,当SYN=1,ACK=0时说明这是一个连接请求报文段,如果对方同意建立连接则应该在响应的报文段中将SYN=1,ACK=1,表示接受请求
FIN终止控制位: 用来释放连接,当FIN=1时表示此报文段发送方的数据已经发送完毕,并要求释放连接。
三. 三次握手
- 服务器进行监听
- 客户端发送SYN包给服务器,客户端进入SYN-SEND状态。
- 服务器收到SYN包后将建立连接的SYN包和应答包一起发送给客户端,并且进入SYN-RCVD状态。
- 客户端收到包SYN+ACK包后,发送应答包ACK给服务器。进入建立连接状态,服务器接收到应答包后进入建立连接状态。
四. 四次挥手
- 客户端发送FIN包告诉服务器,现在开始我已经没有数据可以发了,接着进入FIN-WAIT-1状态,等待应答包。
- 服务器接收到FIN包后,发送一个应答包ACK,告诉客户端我知道了,现在我还有数据要发,先等我,接着服务器进入CLOSE-WAIT状态。客户端接收到应答包ACK后进入FIN-WAIT-2状态。
- 服务器发送完所有数据后,同样发送一个FIN包给客户端,告诉客户端,我也没有数据可以发送了,进入LAST-ACK状态。
- 客户端接收到FIN包后发送应答包ACK给服务器,进入TIME-WAIT状态。服务器接收到应答包后进入CLOSE状态。