Gointerface接口声明实现及作用详解
247
2022-09-09
三次握手和四次挥手
TCP协议介绍
I.定义(What):
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流、全双工的运输层通信协议。理解:(1)面向连接:先建立连接,再传输数据(使用协议),数据传输完毕,释放连接。(2)可靠:数据无差错、不丢失、不重复、按序到达。(3)基于字节流:最小单位是字节。(再传输时被看做是一连串的字节流)(4)全双工:指的是收发可以在一端同时进行。
II.功能(HOW)
(1).完成对数据报的确认、流量控制和网络拥塞; (2).自动检测数据报,并提供错误重发的功能;(3).将多条路径传送的数据报按照原来的顺序进行排列;(4).控制超时重发,自动调整超时值;
具体详见:number):seq序号,占32位,用来标识从TCP源端到目 的端发送的字节流。II.确认号(acknowledgement number):ack序号,占32位,只有ACK标志位为1时,确认序号字段才是有效的,ack=seq+1.III.标志位(Flags):共六个(即URG、ACK、PSH、RST、SYN、FIN等)
(二)状态动态分析
(1)客户端和服务器同时属于closed状态,表示没有连接能力:(2)客户端发送请求,客户端打开发送(SYN-sent)状态,同时服务器打开 监听(Listen)状态:(3)服务器在接收到客户端的请求时,服务器切换为回复(SYN-recvd)状态:(4)客户端在接收到服务器的响应时,客户端切换为稳定连接(Estab-lished)状态 同时发送第二次数据:(5)服务器在接收到客户端的第二次数据是,服务器切换为稳定连接 (Estab-lished)状态: (6) 双方建立连接后,开始正常通信数据
(三)三次握手过程分析
静态过程
说明:在建立连接的时候,发送的是TCP数据包,当连接成功了建立的时候,就可以开始发送数据了。
动态过程
文字描述:
第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端 进入SYN-SEND状态,等待服务端确认。第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和 ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入SYN-RCVD状态。第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后客户端和服务端之间可以开始传输数据了。
通俗理解:
(1)男女朋友的交往过程
代表含义< 客户端:男孩 服务器:女孩 三次握手:交往的过程>
(2)双方收发能力的确认
代表含义<客户端:男孩 服务器:女孩 三次握手:收发能力的确认过程>
说明:
(1)建立连接的目的就是为了接收和发送数据(那么建立连接的过程就是测试双方收发能力的过程)(2)如果在建立连接的过程中,能够验证接收双方的接收能力是没问题的,连接工作就是完成了
为什么TCP建立连接时是三次握手不是两次或四次?
表因:“已失效的连接请求报文段”client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。 ---谢希仁《计算机网络》
原因: TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)
抓包所得:
具体分析:
第一次握手:
过程:客户端向服务端发送连接请求报文,该报文的头部中SYN为1,ACK=0,seq=0,(请求发送后,进入了SYN-SENT状态)(1)SYN=1,ACK=0表示该报文段为连接请求报文。(2)seq的值为本次TCP通信的字节流的初始序号。TCP规定:SYN的报文段中不能有数据部分,但是要消耗掉一个序号
第二次握手:
过程:服务端收到了连接请求报文段后,如果同意连接,就会发送一个应答:SYN=1,ACK=1,seq=0,Ack=1(应答发送完后进入了SYN-RCVD状态)(1)SYN=1,ACK=1表示该报文段为连接同意的应答报文。(2)seq=0表示服务端作为发送者时,发送字节流的初始序号。(3)Ack=1表示服务器希望收到下一个数据包发送序号从"1"开始的字节。
第三次握手:
过程:当客户端收到连接同意的应答后,还要再向服务端发送一个确认报文段(表示:服务端发来的连接同意应答已经成功收到)该报文段头部:ACK=1,Seq=1,Ack=1(1)客户端发完这个报文段后就会进入ESTABLISHED状态,服务端收到这个应答后也会进入ESTABLISH状态,此时连接建立完成。
参考内容:
= x,主动关闭TCP连接,等待服务器的确认。
第二次挥手:服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = x+ 1,接着服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态(下面会说什么是半关闭状态),客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。
第三次握手:服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LASK_ACK(最后确认)状态,等待客户端的确认,服务器的连接释放(FIN)报文段的FIN=1,ACK=1,序列号seq=z,确认序列号ack=x+1。
第四次握手:客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。
通俗理解:
(二)TCP与UDP对比
协议 | TCP | UDP |
是否连接 | 面向连接 | 面向不连接 |
传输是否可靠 | 可靠 | 不可靠 |
应用场合 | 传输大流量数据,对可靠性要求较高 | 传输少量数据、对可靠性要求不高 |
速度 | 慢 | 快 |
参考:
(1) ----谢希仁
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~