什么是TCP
tcp是一个面向连接的、可靠的、基于字节流的传输层通信协议
- 面向连接:TCP连接是一对一的,不能实现一对多或多对一,TCP在通信前要首先建立连接,连接成功后才能开始进行通信
- 可靠的:TCP连接要保证通信过程的可靠性,所谓可靠性是指TCP能够检查比特错误并纠正比特错误,同时能够对丢包、失序情况作出一定的应对。
- 基于字节流:在 TCP 建立连接之后,数据被视为一个连续的字节流
为什么需要TCP
由于下层网络层(IP层)不保证网络包的交付、按序交付和数据的完整性,因此需要TCP协议在运输层保证数据传输的可靠性。
TCP报文头格式
各字段作用:
- 序列号
- 连接建立时该值是随机初始化的。其后在数据传输过程中,TCP 连接中传送的数据流中的每一个字节都编上一个序号,而序号字段的值则指的是本报文段所发送的数据的第一个字节的序号,以保证数据传输过程中不乱序。
- 用来解决网络包的失序问题。
- 确认应答号
- 指期望收到对方的下一个报文段的数据的第一个字节的序号,发送端在收到确认应答后可认为在该序号之前的数据都已经被接收端正常接收。
- 用以解决网络丢包的问题。
- 控制位:
- ACK,该位为1时,确认应答号有效
- SYN,该位为1,连接建立号,建立TCP连接所使用特殊字段,该位为1表示希望建立连接
- FIN,同SYN字段的作用,是TCP断开连接时需要的特殊字段,该位为1表示希望断开连接
- RST,该位为1,表示出现异常情况,需要强制断开连接
- 源端口与目的端口
- 用于告诉TCP协议应该把网络数据包交给哪个进程
- 首部长度
- 指出TCP报文的首部长度,单位为4字节,取值范围为0~15,故而TCP报文段的首部长度最大为60字节,固定字段为20字节,因此选项部分最大为40字节
如何确定一个TCP连接
一个TCP四元组可以确定一个TCP连接,其四元组组成为:
其中,源地址与目的地址在IP头部中,作用是将数据包通过IP协议发送给主机;
而源端口与目的端口存在于TCP头部中,作用是告诉TCP协议应该把报文发送给哪个进程
TCP建立连接的过程
TCP在通信前需要首先通过三次握手建立连接,之后才能进行通信,其过程如下:
- 第一次握手:客户端发送SYN报文段,在tcp头部中,置SYN=1,并随机初始一个seq序号,但不携带任何数据。表示客户端要建立连接。
- 第二次握手:服务端收到客户端发来的链接请求后,在tcp头部中,置SYN=1,也随机初始化一个服务端的序号seq放入tcp头部,同时置ACK=1,对客户端也响应一个确认号ack放入头部,该阶段同样不携带数据。表示服务端同意建立连接。
- 第三次握手:客户端收到服务端的同意链接请求报文,此时服务端已经做好了要连接并发送数据的准备,要对服务端发送一个确认报文。在tcp头部中,置ACK=1,但SYN=0,且此后的数据传输过程中SYN都等于0,同时对服务端的序号响应一个确认号,在该阶段,客户端可以携带数据发送给服务端。