TCP三次握手
TCP协议 :
1。源端口 :当前的进程端口,2字节
2。目的端口:对方的端口 ,2字节
3。序号:客户端或者服务器端生成的随机数
4.确认序号:确认上一次发送给数据对方有没有收到
5.标志位
SYN:请求和对方建立连接
ACK:确认没问题 OK
FIN :请求端开连接
6.窗口大小 :接收端通知发送端 缓存剩余的容量,如果为0,发送端阻塞
三次握手的过程
1.服务器端启动监听 →listen();
2.客户端:发起连接→connect();
三次握手的发起端必须是客户端;
第一次握手:
客户端 :
1.将标志位SYN设为1 (其实发送的是整个块)
2 . 生成一个随机序号,int (32位);
服务器端:
1.收到了客户端的TCP协议解析
SYN=1
得到了随机序号, J
第二次握手:*客户端和服务器连接建立了
服务器端:
1.回复ACK,表示同意建立连接
2.ack=J+1,告诉客户端,你发送给我的一个字节的数据已经收到了,1字节代表连接请求;
3.服务器将TCP协议中的SYN=1,向客户端发送请求
4.服务器端也生成了一个随机序号,K;
客户端:
1.接受服务器回复的数据
ACK 同意了客户端的连接请求
SYN:服务器请求的客户端建立连接
服务器端收到的数据字节数:ack-J=J+1 -J=1;
第三次握手:服务器和客户端建立了连接
客户端:
1。在TCP协议中将ACK设置为1 ,同意服务端连接请求
2.ack=K+1,告诉服务器,你给我发送的一个字节的数据收到了,1字节代表连接请求
服务器:
接受数据,解析TCP协议
ACK=1;客户端同意了连接请求
客户端收到的字节数:ack -K=K+1-K=1;
四次挥手的过程
//断开链接的过程,四次挥手完成之后,双向连接被双向断开
//断开连接的请求可以由客户端发起,也可以有服务器发起
//需要用到的标志位:FIN,ACK
-
图中是客户端先断开连接,其实服务器端先断开也可以
-
在程序中怎么断开连接
调用close (通信的文件描述符)函数,连接断开
在程序中服务器端和客户端程序都调用了close()函数,四次挥手就完成了
过程:
第一次挥手:
主动断开的连接的一方:
1.将TCP中的FIN标志位为设置为1
被动断开链接的一方:
1.接受对方请求,解析TCP协议
FIN=1;
第二次挥手:**单向断开(断开方与被断开方断开)
被断开的一方:
1.同意对方的断开链接的请求,ACK =1;
2 确认序号:在对方发送的序号基础加一
主动断开链接的一方:
接受TCP协议解析
检测是否ACK是否为1;
检测发送对方的1字节数是否收到了
第三次挥手:
被断开的一方:
.将TCP中的FIN标志位为设置为1
发送序号K
主动断开的一方:
接受数据,解析TCP协议
FIN=1
第四次挥手:被断开的一方 与主动断开的一方 断开链接
主动断开链接的一方:
同意对方链接的请求 TCP 的ACK =1
计算确认序号,发送给对方
被动断开的一方:
接受TCP协议解析
检测ACK==1
检测发送给对方的1字节数是否收到了