TCP协议是一个安全的、面向连接的、流式传输协议。
安全:TCP在安全方面提供了一些保护机制。虽然TCP本身并不是一个安全协议,但它可以与其它安全协议(如SSL/TLS)结合使用,以实现数据传输的安全性。
面向连接:TCP是一种面向连接的协议,这意味着在进行数据传输之前,发送方和接收方需要通过建立连接来进行通信。
流式传输:TCP使用流式传输机制,将数据划分为连续的字节流。它不关心数据被分成多少个包或数据包的顺序,而是将数据视为一个连续的流。
三次握手
Tcp连接是双向连接,客户端和服务器需要分别向对方发送连接请求,并且建立连接,三次握手成功之后,二者之间的双向连接也就成功建立了。如果要保证三次握手顺利完成,必须要满足以下条件:
服务器端:已经启动,并且启动了监听(被动接受连接的一端)
客户端:基于服务器端监听的IP和端口,向服务器端发起连接请求(主动发起连接的一端)
三次握手具体过程如下:
第一次握手:
客户端:客户端向服务器端发起连接请求将报文中的SYN字段置为1,生成随机序号x,seq=x
服务器端:接收客户端发送的请求数据,解析tcp协议,校验SYN标志位是否为1,并得到序号 x
第二次握手:
服务器端:给客户端回复数据
回复ACK, 将tcp协议ACK对应的标志位设置为1,表示同意了客户端建立连接的请求
回复了 ack=x+1, 这是确认序号
x: 客户端生成的随机序号
1: 客户端给服务器发送的数据的量, SYN标志位存储到某一个字节中, 因此按照一个字节计算,表示客户端给服务器发送的1个字节服务器收到了。
将tcp协议中的SYN对应的标志位设置为 1, 服务器向客户端发起了连接请求
服务器端生成了一个随机序号 y, 发送给了客户端
客户端:接收回复的数据,并解析tcp协议
校验ACK标志位,为1表示服务器接收了客户端的连接请求
数据校验,确认发送给服务器的数据服务器收到了没有,计算公式如下:
发送的数据的量 = 使用服务器回复的确认序号 - 客户端生成的随机序号 ===> 1=x+1-x
校验SYN标志位,为1表示服务器请求和客户端建立连接
得到服务器生成的随机序号: y
第三次握手
客户端:发送数据给服务器
将tcp协议中ACK标志位设置为1,表示同意了服务器的连接请求
给服务器回复了一个确认序号 ack = y+1
y:服务器端生成的随机序号
1:服务器给客户端发送的数据量,服务器给客户端发送了ACK和SYN, 都存储在这一个字节中
发送给服务器的序号就是上一次从服务器端收的确认序号因此 seq = x+1
服务器端:接收数据, 并解析tcp协议
查看ACK对应的标志位是否为1, 如果是1代表, 客户端同意了服务器的连接请求
数据校验,确认发送给客户端的数据客户端收到了没有,计算公式如下:
给客户端发送的数据量 = 确认序号 - 服务器生成的随机序号 ===> 1=y+1-y
得到客户端发送的序号:x+1