TCP
特点
- Tcp是面向连接传输层协议
- 每一条Tcp连接只能有两个端点
- Tcp提供可靠的交付服务
- Tcp提供全双工的通信
- Tcp是面向字节流的
报文段首部
- 源端口和目的端口就是建立连接的两个主机所分配的端口号
- 序号就是发送的报文段的编号,占4字节,共32位也就是4294967296个序号,超过这个范围值时将回到序号0,也就是序号使用mod 2^32的运算
- 确认号则是期望对方下一个报文段的第一个数据字节的序号。例如B收到了A 的一个报文段,序号字段值位36,而数据长度是20字节,则表示收到了36~55的数据,则下一个期望的序号就是56,即确认号是56
- 数据偏移指的Tcp数据字段距Tcp报文段起始位置有多远,也就是规定了Tcp首部的长度,因为Tcp首部有可选字段。因为数据偏移只有4位,则数据偏移的最大值为60字节,也就是Tcp首部最大长度为60字节
- 保留位:目前置0,供以后使用
- URG:紧急指针,置1时表示紧急指针有效
- ACK:ACK=1时,确认字段有效
- PSH:推送,为1时立即创建报文段发送出去
- RST复位,Tcp出现严重差错,必须释放Tcp连接
- SYN:Tcp建立连接时来同步序号
- FIN:用来终止Tcp连接
- 窗口:窗口值用来限制对方发送的数据窗口,在滑动窗口部分有讲,可以回头翻翻。
- 检验和:
TCP的连接
Tcp连接的端点称之为套接字或插口。
套接字socket={IP地址 : 端口号port}
则每一个Tcp连接唯一地被通信两端的两个套接字所确定:
TCP::= {socket1, socket2};
TCP的连接的建立
我们将TCP的建立连接的过程称为握手,在建立连接的过程需要交换三个TCP报文段,所以TCP的建立连接也称为三报文握手
我们来看过程
- 首先客户端向服务端发送带有SYN=1的建立连接请求,seq为数据包序号
- 服务端收到后,将ACK 置为1表示确认收到,将ack字段设为 x + 1表示已收到序号为x的数据包,期望下一个收到的是x + 1数据包。然后发送SYN = 1,表示请求建立连接(这才能保证全双工通信)
- 客户端向服务端发送确认收到的报文,ACK=1表示确认收到2过程中的报文,同理将ack设为y + 1,表示下一个期望收到的是y + 1数据包,然后发送服务端期望发送的数据包 x+ 1
为什么要三次握手?
这样才能保证可靠传输。
第一次握手时,对于客户端,它不能确认任何东西,对于服务端,它能确认客户端发送没问题,服务端接收没问题。
第二次握手时,对于客户端,它能确认客户端发送没问题,接收没问题,服务端发送没问题,接收没问题。而对于服务端,它只能能确认客户端发送没问题,服务端接收没问题。
第三次握手时,服务端能确认客户端接收没问题,服务端发送没问题。
如此,能保证可靠的全双工的传输。