TCP与DUP知识点整理

来源:互联网 发布:ip网络广播系统 编辑:程序博客网 时间:2024/06/03 22:59

首先,需要知道的是,TCP、UDP协议对应于传输层


1、TCP连接的三次握手

三次握手

第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的报文段,指明客户端打算连接的服务器的端口,以及初始序号 X(由客户端随机选择,即client_isn),保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入 SYN_SEND 状态。

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认报文段(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己ISN序列号Y(server_isn),放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1。
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

握手过程中传送的报文段不包含应用层数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

简单的说就是Tcp的三次握手简单来说:第一次握手是客户端向服务端发送一个建立连接的请求,第二次握手是服务端向客服端回复建立连接的请求的确认,第三次握手是客服端对服务端确认连接的确认。

2、TCP断开连接的四次挥手

四次挥手
客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

第一次挥手(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
发送完毕后,客户端进入 FIN_WAIT_1 状态。

第二次挥手(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥手(FIN=1,seq=y)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。
发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。
服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

简单的说就是:第一次握手,主机A告诉主机B,我没有数据要发送了,请求关闭。第二次握手,主机B回复主机A,你的请求我收到了,但是我还没准备好,你等我消息。第三次握手,主机B向主机A请求关闭连接(注意,第二次握手是主机B 同意 主机A的关闭连接的请求)。第四次握手,主机A向主机B发送确认断开连接请求,B收到后就关闭连接请求,A等待2MSL(两个最大段生命周期,2 Maximum Segment Lifetime)后依然没有收到回复,则证明B已经正常断开,A也关闭连接。

3、为什么TCP是三次握手,四次挥手

(1)
因为 TCP 是双向通讯协议,作为响应一方(Responder) 要想初始化发送通道,必须也进行一轮 SYN + ACK。由于 SYN、ACK 在 TCP 分组头部是两个标识位,因此处于优化目的被合并了。所以达到双方都能进行收发的状态只需要 3 个分组。
拿两台主机举例,在标准3-way handshake中,主机a发送SYN去主机b,主机b接收到后发送SYN-ACK信息回主机a表示收到syn并确认,主机a收到后发ACK回主机b表示收到确认信息。这样两台主机都知道了对方准备好进行tcp通信。
通俗的说就是:三次刚好够双方都确认已经建立起了连接。(三次握手不是TCP本身的要求, 而是为了满足”在不可靠信道上可靠地传输信息”这一需求所导致的)

(2)
原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。
通俗的说:假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!


4、TCP和UDP的区别

TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。
简单的说,TCP注重数据可靠性,而UDP数据传输快点,但安全性一般。


5、浅析TCP字节流与UDP数据报的区别


参考文章:
https://hit-alibaba.github.io/interview/basic/network/TCP.html
https://hit-alibaba.github.io/interview/basic/network/UDP.html
TCP三次握手和四次挥手

另外附上一篇文章:
TCP/IP、Http、Socket的区别
讲的通俗易懂。

原创粉丝点击