TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。
UDP是一种面向无连接的通信协议,因此不检查对端是否可以通信,直接将UDP包发送出去。TCP与此相反,它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答 (TCP中发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端。)。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。
一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成(建立一个TCP连接需要发送3个包,这个过程也称作**“三次握手”和“四次挥手”**) 。
举个例子,建立连接和中断连接,就好比两个人在通电话:
拨通电话:
A: 喂,你好,能听见我说话吗?(SYN请求)
B:能听见,(ACK响应)你能听见我说话吗?(SYN请求)
A:能听见。(ACK响应)
三次握手,确认建立连接。
挂断电话:
A:我要挂电话了。(FIN请求)
B:好的。(ACK响应)
B:那我也挂电话了。(FIN请求)
A:好的。(ACK响应)
四次挥手,连接关闭。
TCP首部格式
■ 序列号(Sequence Number)
字段长32位。序列号(有时也叫序号)是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。
序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。
■ 确认应答号(Acknowledgement Number)
确认应答号字段长度32位。是指下一次应该收到的数据的序列号。实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。