下文中出现的ACK和ack的含义
ACK:这里出现的ACK即为上面所说的TCP报文段首部中的“ACK字段”,置1时该报文段为确认报文段。是8个比特位中的一位。
ack:而ack则为TCP报文段首部中“确认号字段”的具体数值。ack=x+1说明B希望A下次发来的报文段的第一个数据字节为序号=x+1的字节;ack=y+1说明A希望B下次发来的报文段的第一个数据字节为序号=y+1的字节。ack+num:确认序号。SYN是建立连接
一、详析三次握手
第一次握手:
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(按一个字节算)。
用图像表示为:
二、滑动窗口
窗口可以理解为缓冲区的大小;
滑动窗口的大小会随着发送数据和接收数据而变化
通信双方都有发送缓冲区和接收数据的缓冲区
服务器:
发送缓冲区(发送缓冲区的窗口)。
接收缓冲区(接收缓冲区的窗口)。
客户端:
发送缓冲区(发送缓冲区的窗口)
接收缓冲区(接收缓冲区的窗口)
发送方的缓冲区:
白色格子:空闲的空间
灰色格子:数据已经发送出去了,但是还没有被接收
红色格子:还没有发出去的数据
接收方的缓冲区:
白色格子:空闲的空间
红色格子:已经接收到的数据
(图片来源于网络)
mss:Maximum Segment Size(一条数据的最大的数据量)
win:滑动窗口
1、客户端向服务器发起连接,客户端的滑动窗口是4096,一次发送的最大数据是1460;
2、服务器接收连接情况,告诉客户端服务器的窗口大小是6144,一次发送的最大数据量是1024;
3、第三次握手;
4、4~9,客户端连续给服务器发送了6K的数据,每次发送1K;
5、第10次,服务器告诉客户端,发送的6K数据已经接收到,存储在缓冲区,缓冲区的数据已经处理了2K,窗口大小为2K;
6、第11次,服务器告诉客户端,发送的6K数据已经接收到,存储在缓冲区,缓冲区的数据又处理了2K,相当于处理了4K,窗口大小为2K;
7、第12次,客户端给服务器发送了1K的数据;
8、第13次,客户端主动请求服务器断开连接,并且给服务器发送了1K的数据;
9、第14次,服务器回复ACK 8194,a:同意断开连接的请求 b:告诉客户端已经接收到刚才发的2K数据 c:滑动窗口2K;
10、第15、16次,通知客户端滑动窗口的大小;
11、第17次,第三次挥手,服务器端给客户端发送FIN,请求断开连接;
12、第18次,第四次回收。
三、四次挥手
四次挥手在断开连接的时候,程序中调用了close(),会使用TCP协议进行四次挥手。
客户端和服务端都可以主动发起断开连接,谁先调用close(),谁先发起断开连接。
因为在TCP连接的时候采用三次握手建立的连接是双向的,断开的时候也需要双向的断开。