计算机网络总结 TCP协议 一

tcp协议是什么?介绍一下

TCP(Transmission Control Protocol,传输控制协议)是互联网协议族中的一种基于连接的、可靠的、面向字节流的传输协议。TCP协议提供了全双工通信、数据分段、重传机制、流量控制、拥塞控制等功能,是Internet上应用最广泛的传输层协议之一。

TCP协议的特点包括:

  • 基于连接: 在数据传输之前,发送方和接收方需要通过三次握手建立连接并进行状态确认,然后才能进行数据传输。
  • 面向字节流: TCP数据流被看作是一个连续的字节流,而不是一个个独立的消息或数据包。
  • 可靠性: TCP协议保证数据传输的可靠性,采用序列号、确认号和重传机制来确保数据的正确性和完整性。
  • 流量控制:TCP协议支持流量控制机制,通过滑动窗口技术控制发送方的数据发送速率,防止网络拥塞或资源浪费。
  • 拥塞控制:TCP协议支持拥塞控制机制,通过动态调整滑动窗口大小、慢启动、拥塞避免和快速恢复等算法来保证在网络拥塞时TCP连接的可靠性和带宽利用率。

TCP协议在应用层之上提供了一个可靠的数据传输服务,被广泛应用于Web浏览器、电子邮件、文件传输等Internet应用中。除了TCP协议外,UDP协议也是另一种常见的传输层协议,它是一种不可靠的、无连接的传输协议,适用于对数据传输可靠性要求较低的应用场景。

tcp的三次握手过程介绍一下?

1: 客户端向服务端发起一个tcp连接请求, 发起这个请求的时候,客户端向服务端发送 SYN=1包.seq=j 序列号. (SYN=1 是tcp协议中的一个标志位,表示SYN的标志位被设置为1的报文段, 在三次握手中,当客户端向要和服务端建立连接的时候,它就会向服务端发送SYN包,用来表明希望和服务端建立连接. SYN包携带了客户端的初始序列号(ISN)以及一些其他控制信息如MSS,窗口大小等. ) 

2:当服务端收到客户端的连接请求之后,也就是收到了SYN包, 服务端会返回一个SYN+ACK包作为回应,其中ACK包和SYN包标志位都被设为1,表示确认了客户端的连接请求,并且准备好连接, 同时,服务端也会返回给客户端一个随机的序列号seq=K,并将客户端的初始序列号j+1作为确认序列号ack传给客户端.

3:客户端收到服务端的回复SYN+ACK包之后,仍然需要发送最后一个ACK包进行确认. 该ACK包标志位被设为1,确认序列号ack=K+1,以及随机确认好seq, 上图中没有显示.

为什么要发送SYN包?

SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号. 即表示客户端向服务端发起tcp连接请求. SYN标志位的值取决于TCP报文段的具体用途和场景,可以为0或1,但在TCP三次握手过程中,SYN标志位的值通常被设置为1。

第二次服务端为什么要发送ACK,seq,ack=x+1?

ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。

比如客户端发来了SYN=1 .seq=x  那么服务端会返回SYN=1 ACK=1,seq=y,ack=x+1.

ACK=1 的意思是, 表示确认号有效, 0表示报文中不包含确认信息.

ack=x+1, 表示服务端期望下一次接收到客户端发送的数据时,可以接收从序列号x+1开始的数据。也意味着告诉客户端已经接收到了客户端SYN包,并准备连接.

而服务端发送自己的初始序列号seq,则是为了在后续的数据传输中保证数据的可靠性。

为什么是三次握手,可以两次握手么?

比如 c端 第一次向 s端 发送了一个请求建立连接信号 序号为seq=1 , 如果由于网络拥塞或者其它原因,导致第一次的seq=1的请求迟迟到达不了s端, 客户端c 便会重新再发起一次请求,第二次请求,seq=2. 第二次请求s端收到了,便确认请求然后开始通信,通信结束后释放连接. 这时,如果第一次的seq=1的请求连接到达了服务端, 由于两次握手,所以服务端就直接进入estab-lished状态,等待发送数据或者主动发送数据, 但是这个时候客户端已经是closed状态了,服务端就会一直等下去,这样便会浪费服务端的资源.

什么是半连接队列?

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列

ISN(Initial Sequence Number)是固定的吗?

当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

四次挥手过程介绍一下?

1:C端向S端发起断开连接请求 -----FIN=1,seq=x 客户端向服务端发起断开请求,FIN结束标志

2:S端向C端回复----- ACK=1 seq=y ack=x+1 服务端回复客户端 ack=x+1 让客户端知道自己的tcp断开请求已经得到验证

3:S端向C端回复-----FIN=1 ACK=1 seq=z ack=u+1 服务端第二次回复的时候不会立刻断开连接,它会先确保传输给客户端的数据是否都传输完毕,完毕了就会发送FIN报文 和随机序列号进行回复

4:C端向S端回复-----FIN=1 ACK=z+1 seq=u+1 最后客户端会回复服务端的断开请求,ack=z+1 告知服务端完成请求验证回复,至此断开连接完毕.

四次挥手的状态:

1: 客户端向服务端发送FIN断开请求后 进入 FIN_WAIT1 状态

2:服务端收到FIN后,向客户端发送ACK之后, 服务端进入 CLOSE_WAIT状态

3:客户端收到服务端的ACK报文之后, 进入FIN_WAIT2状态, 此时连接已经断开一半了,如果服务器还有数据要发送可以继续发送.

4:服务端发完数据之后,会向客户端发送FIN报文 告知客户端,然后进入,LAST_ACK状态

5:客户端收到服务端的断开请求FIN后, 会立刻 向服务端发送ACK确认, 然后客户端进入TIME_WAIT状态, 服务端进入CLOSED状态

6:再经过2ML之后,客户端也进入了CLOSED状态

至此,还有一个状态没有出来,CLOSING状态.

7:CLOSING状态表示 客户端发送了FIN请求,但是却只收到了服务端的FIN ,没有收到ACK ,这说明了ACK包在传输过程中丢包了.发生了意外.

为什么还要TIME_WAIT 等待2msl?

2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间;

最后一次挥手的时候,客户端向服务端发送了最后的ack回复, 但是这个ack回复是可能会丢失的,所以不可以发送ack之后就立即closed.

客户端必须确认服务端收到ack报文了, 所以客户端会进入2msl的等待时间, 如果在该时间里 收到了服务端的fin,那么客户端就会重发ack然后再等待2msl, 直到这2mls都没有再收到服务端发来的信息,那么客户端就会判断已经断开连接成功,ack已被接受,支持进入closed状态.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值