UNIX 网络编程学习——关于 TCP
传输控制协议TCP
- TCP 提供客户与服务器之间的连接(connection)。TCP 客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接
- TCP 提供了可靠性(reliability)。这里的可靠性是指数据的可靠递送和故障的可靠通知。当 TCP 像另一端发送数据时,它要求对端返回一个确认,如果没有收到确认,TCP 就自动重传数据,数次重传后,TCP 才放弃
- TCP 提供流量控制(flow control)。TCP 总是告诉对端在任何时刻它一次能够从对端接受多少字节的数据,这成为通告窗口(advertised window),窗口大小是时刻动态变化的。
- TCP 是全双工的(full-duplex)。这意味着在一个连接上,应用可以在任意时刻在进出两个方向上即发送数据又接受数据。
TCP 三次握手(three-way handshake)
TCP 建立连接时会发生以下的情形
- 服务器必须准备好接受外来的连接,这通常通过调用 socket、bind 和 listen 这三个函数来实现,我们称这个过程为被动打开(passive open)。
- 客户通过 connect 发起主动打开(active open),这导致客户发送一个 SYN 信号,他告诉服务器客户将在连接中发送的数据的初始序列号。
- 服务器确认客户的 SYN,服务器发送这个 SYN 和对客户 SYN 的确认 ACK
- 客户必须确认服务器的 SYN
这种交换至少需要三个分组,所以我们称之为TCP 的三次握手。
TCP 四次挥手
- 某个应用进程先调用 close,我们称该端执行主动关闭(active close),该端的 TCP 就发送了一个 FIN 分节,表示数据发送完毕。
- 接受到这个 FIN 的对端执行被动关闭(passive close),这个 FIN 由 TCP 确认,FIN 的接受意味着接受端的应用进程在相应的连接上再无额外数据可接受,于是把接受作文一个文件结束符(end-of-file)传递给接受端应用进程。
- 接受到这个文件结束符的应用进程调用 close 关闭它的套接字,这导致它的 TCP 也发送一个 FIN
- 执行主动关闭的那一端确认 FIN