4.17、TCP三次握手
- 1.TCP三次握手
- 2.TCP通信具体流程
- ①三次握手
- ②服务器客户端进行通信
1.TCP三次握手
TCP
是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如IP
地址、端口号等。TCP
可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP
头部。TCP
提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用四次挥手来关闭一个连接。- 三次握手的目的是保证双方互相之间建立了连接。
- 三次握手发生在客户端连接的时候,当调用
connect()
,底层会通过TCP
协议进行三次握手。
- 16 位端口号(port number):告知主机报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行
TCP
通信时,客户端通常使用系统自动选择的临时端口号。 - 32 位序号(sequence number):一次
TCP
通信(从TCP
连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机 A
和主机 B
进行TCP
通信,A
发送给B
的第一个TCP
报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)
。那么在该传输方向上(从 A 到 B)
,后续的TCP
报文段中序号值将被系统设置成ISN
加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP 报文段
传送的数据是字节流中的第1025 ~ 2048
字节,那么该报文段的序号值就是ISN + 1025
。另外一个传输方向(从B 到 A)
的TCP 报文段
的序号值也具有相同的含义。 - 32 位确认号(acknowledgement number):用作对另一方发送来的
TCP 报文段
的响应。其值是收到的TCP 报文段
的序号值 + 标志位长度(SYN,FIN)
+ 数据长度 。假设主机 A
和主机 B
进行TCP
通信,那么A
发送出的TCP 报文段
不仅携带自己的序号,而且包含对B
发送来的TCP 报文段
的确认号。反之,B
发送出的TCP
报文段也同样携带自己的序号和对A
发送来的报文段的确认序号。 - 4 位头部长度(head length):标识该
TCP
头部有多少个32 bit(4 字节)
。因为4 位
最大能表示15
,所以TCP
头部最长是60 字节
。 - 6 位标志位包含如下几项:
URG 标志
,表示紧急指针(urgent pointer)是否有效。ACK 标志
,表示确认号是否有效。我们称携带ACK
标志的TCP
报文段为确认报文段。PSH 标志
,提示接收端应用程序应该立即从TCP
接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP
接收缓冲区中)。RST 标志
,表示要求对方重新建立连接。我们称携带RST
标志的TCP
报文段为复位报文段。SYN 标志
,表示请求建立一个连接。我们称携带SYN
标志的TCP
报文段为同步报文段。FIN 标志
,表示通知对方本端要关闭连接了。我们称携带FIN
标志的TCP
报文段为结束报文
段。
- 16 位窗口大小(window size):是
TCP
流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP
接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。 - 16 位校验和(TCP checksum):由发送端填充,接收端对
TCP
报文段执行CRC
算法以校验TCP
报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP
头部,也包括数据部分。这也是TCP
可靠传输的一个重要保障。 - 16 位紧急指针(urgent pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。
TCP
的紧急指针是发送端向接收端发送紧急数据的方法。
2.TCP通信具体流程
第一次握手:
1.客户端将SYN标志位置为1
2.生成一个随机的32位的序号seq=J , 这个序号后边是可以携带数据(数据的大小)
第二次握手:
1.服务器端接收客户端的连接: ACK=1
2.服务器会回发一个确认序号: ack=客户端的序号 + 数据长度 + SYN/FIN(按一个字节算)
3.服务器端会向客户端发起连接请求: SYN=1
4.服务器会生成一个随机序号:seq = K
第三次握手:
1.客户单应答服务器的连接请求:ACK=1
2.客户端回复收到了服务器端的数据:ack=服务端的序号 + 数据长度 + SYN/FIN(按一个字节算)
①三次握手