Socket 三次握手四次挥手

梳理一下socket 相关老生常谈的知识点

三次握手四次挥手

先看几个概念

字段    含义
URG    紧急指针是否有效。为1,表示某一位需要被优先处理
ACK    确认号是否有效,一般置为1。
PSH    提示接收端应用程序立即从TCP缓冲区把数据读走。
RST    对方要求重新建立连接,复位。
SYN    请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN        希望断开连接。

 PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

第一次握手:客户端发送建立连接的标志SYN,并携带自己的序号给服务器,进入SYN_SENT状态;

第二次握手:服务端收到后回应客户端自己收到了你的连接请求,就发送ACK= 1和自己的SYN = 1, 并带上自己的序列号seq = y,同时返回客户端序列号并加1 (ack = x +1),服务器进入SYN_RCVD;

第三次握手:客户端收到服务器的报文后,回复服务端我已收到ACK = 1;并且带上服务端的序列号ack = y+ 1;这样双方就建立起了连接,进入 estab-lished(establish _listen).

四次挥手

这里为什么断开连接多了一次,对比两张图可以发现是因为服务器在回复客户端的断开请求时,把确认收到客户端报文和发送自己的断开连接请求分开了,导致多了一次。为啥不能合在一起?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

 现在在来描述一遍相应流程:

第一次挥手:客户端发送自己的断开请求和自己序列号 seq = u

第二次挥手:服务端收到后发送确认收到报文ACK=1,ack=u+1,并携带自己的序列号 seq = w ;

第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1;

第四次挥手:客户端回复服务端你的报文我收到了ACK = 1,ack = w+1,此时服务器立即断开连接,而客户端还需要等待一会儿才会断开连接。

TCP、UDP区别和联系

TCP协议---传输控制协议

UDP协议---用户数据报协议

二者区别和联系从以下方面考虑:

是否连接 面向连接 面向非连接 
传输可靠性 可靠 不可靠 
应用场合 传输大量数据 少量数据 
速度 慢 快

TCP:

  • 建立连接需要三次握手机制,在数据传递时,有确认、窗口、重传、拥塞控制机制;数据有序,不丢失,可靠;
  •  慢,效率低,占用系统资源高;

UDP:

  • 传输前不需要建立连接,可以一对多,一对一(smartConfig 手机在局域网搜索设备,并传输wifi信息)
  • 数据无序,会重复,也可能丢失。

OSI 七层模型 TCP/IP协议族

  • 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
  • 表示层 数据格式化,代码转换,数据加密 没有协议
  • 会话层 解除或建立与别的接点的联系 没有协议
  • 传输层 提供端对端的接口 TCP,UDP
  • 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
  • 数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
  • 物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

看一下报文

 这些传输层协议都有一些共同的东西(两张图,一个是http,一个UDP),比如说目的地 destiantion,源头 source , 二进制码流信息等等,后面再详细解析这些知识点。


参考文章三次握手四次挥手:https://blog.csdn.net/qq_38950316/article/details/81087809

猜你喜欢

转载自blog.csdn.net/sjh_389510506/article/details/88320326