TCP报文与三次握手四次挥手
1. TCP报文格式
端口号
用来标识同一台计算机的不同的应用进程
- 源端口:源端口和IP地址的作用是表示报文的返回地址
- 目的端口:端口指明接收方计算机上的应用程序接口
TCP报文中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接
序号和确认号
是TCP可靠传输的关键部分。
- 序号是本报文段发送的数据组的第一个字节的序号。EG.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。序号确保了TCP传输的有序性。
- 确认序号,ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。
数据偏移/首部长度
4bits,4位
保留
6bits
控制位
- URG:紧急指针标志,为1时表示紧急指针有效,为0是忽略紧急指针
- ACK:确认序号标志,为1时表示确认号有效,为0表示报文不含确认信息,忽略确认号字段。TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文ACK必须为1
- PSH:push标志,为1表示带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,胃不适在缓冲区排队
- RST:重置连接标志,用于重置由于主机崩溃或其他原因出现的错误的连接。
- SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1
- FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流
窗口
滑动窗口大小,用来告知发送端接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个16bit字段,因为窗口大小最大为65535
校验和
奇偶校验,此校验和是对整个TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。由发送端计算和存储,由接收端进行校验。
紧急指针
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号
选项和填充
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分
TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
2.TCP三次握手
TCP/IP协议是传输层的一个面向连接的安全可靠的传输协议。三次握手机制是为了保证能建立一个安全可靠的连接。
第一次握手是由客户端发起,客户端会向服务端发送一个报文,报文里面SYN位标志位置1,当服务端收到这个报文之后就知道客户端要发起一个新的连接,于是服务端会向客户端发送一个确认消息报文,确认消息报文中,ACK位置1。
以上两次握手后,客户端已经知道全部的信息,客户端可以向服务端发送消息,也可以收到服务端发送的消息。但是对于服务端而言,两次握手是不够的。因为到目前为止,服务端只知道一件事情,客户端发给服务端的消息服务端知道,但是服务端发给客户端的消息,客户端能不能收到未知,所以还要进行第三次握手。
第三次握手是,当客户端收到服务端发来的确认消息报文之后,还要继续给服务端一个回应,也是一个ACK位置1的确认消息。
通过以上三次连接以后,不论是服务端还是客户端,都彼此知道自己既能发送消息也能收到对方的消息,这时一个面向连接的安全可靠的连接就建立了。
3. TCP四次挥手
四次挥手机制也是客户端首先发起的:
客户端会发送一个报文,这个报文里面,FIN位标志位置1
当服务端收到这个报文后,服务端就知道了客户端想要断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的消息时,对于服务端而言极有可能还有未发送完的消息还要继续发送,所以对于服务端而言它只能做一个消息确认,告诉客户端已经收到了将要断开连接的消息。
等待服务端做好准备以后,服务端会再向客户端发送一个FIN位置1的断开连接报文。这个报文表示服务端已经做好了断开连接的准备,此时客户端也要向服务端发送一个消息确认的报文。
一共有4次,通过这4次的相互沟通和连接,服务端和客户端都做好了断开连接的准备,此时连接就可以断开了。