TCP是传输层协议,提供可靠的字节流服务,它将大块的数据分割为一个个报文段来管理。
1.TCP的报文段结构
图片转自 如故
目前我们只需要知道TCP报文段有如下内容:
源端口号和目的端口号:这个不用说,表明该TCP报文来自哪,要去哪。
序号和确认号:这是报文段首部最重要两个字段,也是TCP可靠数据传输的关键部分,下面详细讲。
6比特的标志字段:ACK用于确认是否收到,RST、SYN、FIN用于连接的简历和拆除。PSH和URG暂时不需要了解。
16位窗口大小:该字段用于流量控制,也就是指示接收方愿意接受的字节数量,用来控制发送方的发送速率。
数据:字面意思,传送的具体数据。
序号和确认号
前面提到,TCP是提供可靠的字节流服务,它将数据看成有序的字节流,而一个报文段的序号就是该报文段首字节的字节流编号。举例来说,A向B传送一个5000字节的数据,假设TCP将其每个字节编号,并分成五个报文段,那么第一个报文段的序号就是0,第二个报文段的序号就是1000,第三个2000,以此类推。这些序号都将被填写到TCP报文头部的序号字段中。
下面是确认号,我们知道TCP是全双工的,也就是双方都可以发送和接收数据。举例来说,A向B发送了0–999的数据,B收到该数据后,它也有数据需要发送到A,那么B发送出去的报文段中,确认号就填1000,该确认号就是A下次发送数据需要填的序号,想象一下:A的第二个报文段序号是不是1000?
2.TCP的连接(三次握手与四次挥手)
1.三次握手
其中大写的ACK是标志位,小写的ack是确认号,小写的seq是序号
1.1三次握手(Three-way Handshake