计算机网络 -- TCP的三次握手
参考:https://blog.csdn.net/qq_38950316/article/details/81087809
一)、TCP协议的特点
定义:
1.是一个面向连接的、可靠的、基于字节流的传输层协议。
2.将应用层的数据分割成报文段并发送给目标节点的TCP层。
3.数据都有序号,对方收到则发ACK确认,没有则重传。
4.使用校验和来校验数据在传输过程中是否有误。
二)、TCP报文头的结构
TCP报文头结构如下:
请求报文头由4个字节,32位二进制数组成。
第一层:
源端口 目的端口 (各占16位)
第二层
序列号(占32位)
官方作用:用来标记数据段的顺序,Tcp把连接发送的所有字节数据都编上号,第一个字节序号由本地随机产生,给字节编上号后,就给每一个报文段编上号,每个报文段的编号就是该报文段第一个字节的编号。
个人理解: tcp协议的数据段由32位二进制组成,给数据段的所有字节数据都编上号,TCP将数据分割成报文段分发的目标节点的TCP层,因为给每个字节都编上了序号,那么,每一个数据段都有其对应的序号啦,即该数据段的第一个字节所对应的编号就是该数据的的编号,这样有利于接收方对数据的重排,保证的接收数据的可靠性。
第三层
ack确认号(占32位): 期望收到下一个字节的编号。
例: 客户端A向 -- >服务端 B发送了一个报文段,该报文段的序号为301, 长度为200,服务端B成功接收了改报文段,响应客户端确认收到将ack = 501的值传给客户端A,期望下一次收到的报文段的字节编号从502开始。
第四层
偏移量 保留 URG/ACK/PSH/RST/SYN/FIN (占16位) 窗口(占16位)
URG: 紧急指针, 0:有效 1:忽略紧急指针
ACK: 确认标志 ,1: 确认有效, 0:报文中不含确认信息,忽略确认字段。
PSH: push标志,接收方接收到报文后应该尽快交付给用用程序,而不是在缓冲区 中排队。
RST: 重置连接标志,重置错误连接。
SYN: 同步连接序号,用于建立连接,SYN =1, ACK = 0(连接请求报文段) 没有使 用请求捎带的确认方式; SYN =1, ACK =1 (连接接受报文段)使用连接请求捎 带的连接方式。
第五层
检验和(占16位) 紧急指针(占16位)
第六层
可选项
三)、TCP的3次握手
TCP三次握手的过程
1.客户端A主动打开处于closed状态,服务端B被动打开处于closed状态
2.服务进程创建传输控制块等待客户请求,此时服务器处于监听状态
3.客户端A创建传输控制块,发送连接请求报文,此时客户端进程进入同步已发送 状态SYN-SEND
请求报文内容:SYN =1, seq = x ;(第一次握手)
特点: 该请求报文并没有携带数据,但是服务端也消耗了一个字节,当服务端发 回确认报文时,期待收到下一个字节的编号, ack = x + 1;
SYN: 同步连接序号,
seq : 报文段的第一个字节的编号,刚开始的seq是随机的一个数
4.服务器同意连接,并发送一个确认报文,此时服务器进入同步收到状态SYN- RCVD
确认报文内容:SYN =1, ACK = 1, seq = y, ack = x+1;(第二次握手)
ack: 期待收到下一个字节的编号
seq:是服务端响应报文段的字节编号
5.客户端进入连接状态ESTAB-LISHED
连接报文内容:SYN =1, ACK =1, seq = x +1, ack = y+1;(第三次握手)
6.服务端进入到连接状态ESTAB-LISHED