tcp三次握手:握手并不需要我们去做,连接服务器过程中内部进行三次握手
标志位 共六个
SYN:请求建立连接
ACK:应答
FIN:断开连接
连接需要三次握手:
第一次握手:(客户端发送一个包)
客户端:
⦁ 携带标志位:SYN(1)
⦁ 发送32位随机序号1(用四个字节表示),这一步可以携带数据,也可以不携带数据,一般不携带
服务器端:
检测SYN的是是否为1
第二次握手:
服务器:
⦁ ACK的标志位(1)+确认序号(随机序号1+1)
⦁ 发起一个连接请求,SYN(1)+32位随机序号
客户端:
⦁ 检测标志位SYN是否为1,检测32位第二次发过来的序号(随机序列1+1)是否正确
第三次握手:
客户端:
发送确认数据包ACK(1)标志位+随即序号2+1
服务器端:
⦁ 检测ACK是否为1
⦁ 确认序列号是否正确(随即序号2+1)
TCP数据传输过程:
mss:最大数据长度<mss 1460>意思就是最多传说1460个数据
整个过程分为三个过程,我们说一下第二个过程也就是服务端和客户端之间的数据传送:
在第二部分开始,客户端发送随即序号1001(20)ACK 8001 ,1001对方最后一次发送ACK的时候携带的确认序号(三次握手的时候的随机序列号),20表示携带数据大小,8001最新的确认序列号(三次握手阶段的数字)。8001(10) ACK 1021 ,8001(10)回复客户端10个大小的数据,ACK 1021应答数据收到,收到20个大小的数据(1001+20),ACK 8081 只是确认数据收到了,但是并没有回复数据。
要是1001(20)ACK 8001 发送之后收到的是ACK 1001就意思是没有收到,那么就会重新发送,这也就是为还是那么TCP安全的原因了,每次发送完数完之后都会确认
四次挥手:(哪一端断开连接都可以)
需要一个标志位:FIN
编号:对方最后一次发送AFK的时候携带的信号
第一次挥手:
客户端:
⦁ 发送断开连接的请求,FIN+序号(对方最后一次发送ACK的时候携带的确认序号)
⦁ ACK+序号
服务端:
⦁ 检测FIN的值是否为1
⦁ ACK的作用告诉对方之前发的数据收到了多少
第二次挥手:
服务器端
⦁ 给客户端发送确认的数据包ACK+确认编号,FIN对应的序号+1(如果有数据发送也要加上数据大小)
客户端:
⦁ 检测ACK的值
⦁ 检测确认序号
第三次挥手:
服务器端:
⦁ 发送断开连接的请求FIN+序号
⦁ ACK+序号
客户端:
⦁ 检测ACK的值
第四次挥手:
客户端:
发送ACK+序号+1(要是有数据还要加数据大小)
四次挥手体现在代码中就是在 服务器端和客户端各close()就可以了。
tcp—滑动窗口(缓存,缓冲区)
win 4066: win—滑动窗口,4096滑动窗口对应的缓冲区大小
从图可以看出客户端西安给服务端发送连接请求(客户端都是主动的连接,服务器端是被动的等待连接),然后进行了三次握手,握手过程中客户端告诉服务器端我缓存大小4k,一次最多发1460个字节,然后服务器端回复我缓存大小6k最多接受1k,然后客户端确认信息之后,双方开始数据传输,客户端发送数据较快,连续发了六次数据,然后收到服务端的回复,回复说你发的6k数据我都收到了,并且我的缓冲区现在还有2k空间(因为开始握手的时候产生的随机序号就是0,那么每次确认的序号就是数据大小+1),紧接着服务端读取了一会数据之后又回复说,我现在缓冲区还有4k,紧接着客户端又连续发送了1次数据和一条主动断开连接的请求,服务端还在处理数据,连发三条数据的确认信息,意思就是我缓冲区现在空了,但是现在客户端已经断开了连接,但是可以作为客户端发送断开连接的回复(应答),最后由服务器端请求断开连接,客户端给予应答 ,四次挥手结束。
tcp是面向安全的传输
当管道(缓存)满了的时候就会阻塞等待
1
1
1
1
1
1
1
1
==========================================================================================
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
==========================================================================================
1
1
1
1
1
1
1
转发博文https://www.cnblogs.com/laowz/p/6947539.html