目录
1.TCP头部格式
- 控制位
- URG (紧急位) :表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer) 只有当URG=1时才有效
- ACK (确认位) :表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后, ACK必须为1 ,带ACK标志的TCP报文段称为确认报文段
- PSH (急切位) : 提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
- RST (重置位) :如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃), 必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
- SYN (同步位) :在建立连接时使用,用来同步序号。当SYN=1, ACK=0时,表示这是一个请求建 立连接的报文段;当SYN=1, ACK=1时,表示对方同意建立连接。SYN=1, 说明这是一一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
- FIN (断开位) :表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1, 即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
- 窗口大小: 表示现在允许对方发送的数据量, 也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量, 达到此值,需要ACK确认后才 能再继续传送后面数据,由Window size value * Window size scaling factor (此值在三次握手阶段TCP选项Window scale协商得到)得出此值
- 校验和:提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置
- 选项部分: 其最大长度可根据TCP首部长度进行推算。 TCP首部长度用4位表示,选项部分最长为: (2^4-1)*4-20=40字节
2.TCP连接建立:三次握手
TCP三次握手过程:
TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。
1.第一次握手
TCP客户端向TCP服务器端发送连接请求报文SYN(seq=x),进入同步已发送状态(SYN_SEND),等待TCP服务器回应。TCP连接请求报文段首部中的同步位SYN被设置为1,表明这是一个TCP连接请求报文段。序号字段seq被设置了一个初始值x,作为TCP客户进程选择的初始序号。注意:TCP规定SYN被设置为1的报文段不能携带数据,但要消耗掉一个序号。由于TCP连接建立是由TCP客户主动发起的,因此被称为主动打开连接。
2.第二次握手
TCP服务器端收到TCP客户端连接请求报文SYN(seq=x)后,将客户端的请求包SYN(seq=x)放入到自己的未连接队列,如果同意建立连接,此时TCP服务器需要发送两个内容给客户端;
- 向TCP客户端发送确认自己收到其连接请求的确认包ACK(ack=x+1),向客户端表明已知道了其连接请求。(这里ack值为x+1是对TCP客户进程所选择的初始序号的确认)
- 向TCP客户端发送连接询问请求包SYN(seq=y),询问客户端是否已经准备好建立连接,进行数据通信。(这里序号值随机,作为TCP服务器进程选择的初始序号)即在第二次握手时TCP服务器向TCP客户端发送ACK(ack=x+1)+SYN(seq=y)包,该报文段首部中的同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报段。发送完该报文段此时服务器进入同步已接收状态(SYN_RCVD)。请注意:这个报文段不能携带数据,因为它是SYN被设置为1的报文段,但同样要消耗掉一个序号。
3.第三次握手
TCP客户端收到TCP服务器的ACK(ack=x+1)+SYN(seq=y)报文后,知道了服务器同意建立连接,此时还需要发送连接已建立的消息给服务器。向服务器发送普通的TCP确认报文段,该报文段首部中的确认位ACK设置为1,序号字段seq被设置为x+1,这是因为TCP客户进程发送的第一个TCP报文段的序号为x,并且不携带数据,因此第二个报文段的序号为x+1。确认号字段ack被设置为y+1,这是对TCP服务器进程选择的初始序号的确认。发送该报文目的就是告诉服务器,我们之间已经建立了连接,可以进行数据通信。请注意:该报文是一个普通的TCP确认报文段,TCP规定普通的TCP确认报文段可以携带数据,但如果不携带数据,则不消耗序号。我们这里一般不携带数据,所以在这种情况下,发送的下个数据报的序号仍是x+1。ACK(seq=x+1,ack=y+1)报文发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。