TCP三次握手

TCP协议是传输层协议,是一种面向连接的传输控制协议,可以控制流量的传输。是一种可靠的传输,能够保证数据的完整性,有效性和有序性。

1.TCP建立连接(三次握手)

  • 任何基于TCP的应用,在发数据之前,都需要由TCP进行“三次握手”建立连接

第一次握手:PC1发送SYN请求,序列号为随机生成的a,由于是第一次建立连接,所以ACK此时为0,flag字段中的SYN置位为1。

第二次握手 :PC2收到PC1的SYN请求,回复SYN ACK,序列号为随机生成的b,ACK为a+1,表示PC1发来的序列号为a的报文已经收到,同时希望PC1下次发来的报文序列号为a+1。因为TCP是一种双向连接所以,PC2发送给PC1的报文中flag位的SYN和ACK都置为1,既表示对PC1序列号为a的一种确认,又表示自己向PC1也发起SYN请求连接。

第三次握手:PC1收到PC2发来的序列号为b,ACK为a+1的SYN ACK报文,知道PC2已经收到PC1第一次发送的序列号为a的SYN,同时PC2发来了连接请求,PC1回复序列号为a+1,ACK为b+1的报文,表示对PC2发来的序列号为b的报文的确认,同时希望PC2下次发来的报文序列号为b+1。

前两次握手并不能携带数据,第三次握手可以携带数据。

第一次握手:PC1知道自己发送数据OK

第二次握手:PC2知道PC1发送数据OK,自己接收和发送数据OK

第三次握手:双方收发数据都OK,可以携带数据

实例演示:

 模拟R1 telnet R2时,查看TCP建立连接的三次握手报文。

 2.TCP保证数据的可靠性和有序性

       TCP通过序列号和确认序列号保证数据的可靠性,完整性和有序性。

 

   1.当TCP连接建立完成后,R1向R2发送数据,发送的第一个数据包的序列号是a+1,确认序列号位b+1,携带128字节的数据。

   2.R2回复R1时,序列号为b+1,确认序列号位a+1+128,携带10字节的数据。此时R2的ack就是最近一次收到的R1数据包的序列号再加上数据的长度,表示对R1发来的序列号为a+1的128个字节数据的确认。

   3.R1再次给R2发送数据,序列号为a+129,确认序列号位b+11,携带10字节的数据。此时R1的ack就是最近一次收到的R2数据包的序列号再加上数据的长度,表示对R2发来的序列号为b+1的10个字节数据的确认。

   4.R2再次回复R1时,序列号为b+11,确认序列号位a+129+10,携带0字节的数据。此时R2的ack就是最近一次收到的R1数据包的序列号再加上数据的长度,表示对R1发来的序列号为a+129的10个字节数据的确认。

   5.R1再次给R2发送数据,序列号为a+139,确认序列号位b+11,携带10字节的数据。此时R1的ack就是最近一次收到的R2数据包的序列号再加上数据的长度,表示对R2发来的序列号为b+11的10个字节数据的确认。为什么此时R1的ack没有变化?因为最近一次收到R2发来的数据包没有携带数据,数据长度为0,因此R1的ack就是b+11+0。
 

总结:seq=上一次seq+数据长度   ack=对方的上一次seq+数据长度==对方的下一次seq号

实例演示:

 

 3.TCP的流量控制

     TCP通过windows字段实现对数据流量的控制。

  1.假设两边的缓冲区大小都是3,在TCP建立阶段就会互相告知对方,自己这边的缓冲区大小是多少。

   2.PC1连续发送三个数据给PC2,此时PC2缓冲区占满,当上层应用拿走一个数据时,缓冲区空闲1。

  3.PC2回复PC1时,就会把自己空闲缓冲区大小告知给PC1。

  4.PC1收到PC2发来的确认,发现对方win字段为1了,那么再次发送数据时,就只能发送一次数据给PC2,但是自己这边的缓冲区大小不变,仍然为3,所以此时PC1发送的报文中,win字段仍然为3。

 4.TCP断开连接(四次挥手)

 

1.PC1发送FIN报文请求断开连接,flag位中FIN和ACK都置为1,seq=101,ack=301。

 2.PC2回复PC1的FIN请求,flag位中FIN和ACK都置为1,seq=301,ack=102。

 3.PC2也发送FIN报文请求断开连接,flag位中FIN和ACK都置为1,seq=301,ack=102。

 4.PC1回复PC2的FIN请求,flag位中FIN和ACK都置为1,seq=102,ack=302。
 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值