1. TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
连接
Connections:
The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream.
The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.
建立一个 TCP 连接需要客户端与服务器端达成以上三个信息的共识。
Socket:由 IP 地址和端口号组成
序列号:用来解决乱序问题等
窗口大小:用来做流量控制
TCP 四元组可以唯一的确定一个连接,源地址、源端口、目的地址、目的端口。
源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。
UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
2. 建立TCP连接
TCP 是面向连接的协议,使用 TCP 必须先建立连接,建立连接是通过三次握手实现的。
第一次
第一次握手:建立连接时,客户端发送SYN包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 [3]
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
三次握手的原因:
避免历史连接
同步双方的初始序列号
减少双方不必要的资源开销
The principal reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,不再是ACK以此来中止历史连接。
3. 断开TCP连接
TCP 断开连接是通过四次挥手的方式实现的。双方都可以主动断开连接,断开连接后主机中的资源将被释放。
4. TCP流量控制
TCP 使用滑动窗口机制来实现流量控制,接收方在返回的数据中会包含自己的接收窗口的大小,以控制发送方的数据发送。