UNIX网络编程笔记(1):TCP简介

来源:互联网 发布:淘宝无法购买东西 编辑:程序博客网 时间:2024/05/11 03:59

1、简介

TCP(Transmission Control Protocol),即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议有以下几个特点:

  1. TCP提供客户与服务器之间的连接:TCP客户先与某个服务器建立连接,跨过连接传输数据,然后断开连接;
  2. TCP提供了可靠性:包括超时重传、RTT(round-trip time往返时间)估计等;
  3. TCP提供了流量控制:包括通知窗口、慢启动等;
  4. TCP是双全工的:在一个连接上可以在任何时刻在进出两个方向上发送与接收数据;

2、TCP连接的建立

TCP建立连接就是大家熟知的三次握手:


通常发生以下几个步骤:

  1. 服务器必须准备好接收外来的连接,通常通过调用socket、bind和listen函数完成,称为被动打开;
  2. 客户通过调用connect函数发起主动打开,导致客户TCP发送一个SYN分节,它告诉服务器客户将在连接中发送的数据的初始序列号;
  3. 服务器必须确认(ACK)客户的SYN,同时自己也发送一个SYN分节,包含服务器将在同一个连接中发送的数据的初始序列号。服务器在单个分节中发送自己的SYN和对客户SYN的ACK;
  4. 客户必须确认服务器的SYN;

也就是说,对于客户和服务器来说,每个人都有一个初始序列号SYN,每个人对对端的确认都是在对端SYN的基础上加1。比如:客户发送SYN为j,那么服务器发送的对客户SYN的ACK就是j+1;同理,如果服务器给客户的SYN是k,那么客户发送给服务器的ACK就是k+1。下图展示了TCP的三次握手的具体过程:


由图可知,ACK中的确认号就是发送这个ACK的一端所期待的下一个序列号。

3、TCP连接的终止

终止一个TCP连接需要四个分节,因为这里涉及到数据的传输。

下面是TCP连接终止的步骤:

  1. 某个应用进程首先调用close函数,称该端执行主动关闭,于是发送一个FIN分节,表示数据发送完毕;
  2. 接收到这个FIN分节的对端执行被动关闭,这个FIN由TCP确认,它的接收也作为一个文件描述符传输给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接受;
  3. 一段时间后,接收到这个文件结束符的应用进程将调用close函数关闭它的套接字。导致TCP也发送一个FIN;
  4. 接收这个最终FIN的原发送端(即执行主动关闭的一端)确认这个FIN;

连接的两端每一端都需要一个FIN和ACK,因此需要四个分节。不过也有可能不是四个。比如,执行主动关闭的一端的FIN可以随数据一起发送,还有,执行被动关闭的一端的ACK和自己的FIN有可能一起发送。下图展示了关闭连接的过程:


和TCP建立连接一样,这里的ACK是FIN+1。

图中给出的是客户端执行主动关闭,不过可以由服务器端执行主动关闭。

4、TCP状态转换图

由于TCP连接的建立涉及到三次握手,终止连接需要四次握手,因此TCP连接的状态在一次完整的连接与终止中可能达到多个。实际上,一个TCP连接的状态可以有11种,这些状态可以由具体的操作连接起来,形成一个状态转换图。

下图就是TCP状态转换图,图中用粗实线表示通常的客户状态转换,用粗虚线表示通常的服务器状态转换:


5、一个完整的TCP连接

下图展示了一个完整的TCP连接,包括建立连接、数据传输与连接终止三个过程:


6、套接字对

一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号。外地IP地址、外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接。

标识每个端点的两个值(IP地址和端口号)通常称为一个套接字。

1 0