传输控制协议---TCP(1)

tcp/ip协议簇:

                                       

TCP的最主要特点:

  1. 面向连接的运输层协议
  2. 点对点,只有两个端点
  3. 可靠交付(无差错,不丢失,不重复,按序到达):TCP负责发现传输问题,一有问题就要求重新传输,直到所有数据都正确安全的到达目的地
  4. 全双工(发送和接收缓存)
  5. 面向字节流不保证数据块大小对应(注意与UDP的区别),但是字节流完全一样)

数据包:

                                              

TCP报文首部:

                               

TCP三次握手:

  1. TCP客户端向TCP服务器发送SYN报文(SYN=1,seq = x)请求建立连接, TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的32位序号是 seq=x
  2. TCP服务器收到客户端发来的连接建立报文后,向客户端发送(SYN,ACK)报文(SYN=1,ACK=1,seq = y,ack=x+1),同意建立连接。
  3. TCP客户端向服务器发送ACK报文(ACK=1,seq = x+1,ack = y+1)

TCP四次挥手:                 

  1. TCP客户端向服务器发送FIN报文(FIN=1,seq = u),请求终止连接
  2. TCP服务器向TCP客户端发送ACK报文(ACK=1, seq = v,ack = u+1),继续进行数据传输。
  3. TCP服务器向客户端发送(FIN,ACK)报文(FIN=1, ACK=1, ack = u+1, seq = w)
  4. TCP客户端向TCP服务器发送ACK报文(ACK=1,seq=u+1,ack=w+1), 客户端收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。
  5.            

关于 TIME_WAIT 过渡到 CLOSED 状态说明: 从 TIME_WAIT 进入 CLOSED 需要经过 2MSL,其中 MSL 就叫做 最长报文段寿命(Maxinum Segment Lifetime),根据 RFC 793 建议该值这是为 2 分钟,也就是说需要经过 4 分钟,才进入 CLOSED 状态。

扩展:

为什么建立需要三次握手,释放连接需要四次挥手呢?

服务端在LISTEN状态下的SOCKET当收到SYN请求连接的时候,可以把SYN和ACK放在一起发送(SYN起同步作用,ACK起应答作用)

关闭时,服务器端当收到客户端发送的FIN报文的时候,仅仅仅仅仅仅表示客户端没有东西要发送给服务器了,但蛋蛋蛋蛋未必服务器所有的数据已经发送给了客户端,所以服务器未必会马上关闭SOCKET,也就是说,可能服务器还要发送一会数据给客户端,然后再发送FIN报文给客户端表示你同意关闭连接,所以这里的FIN报文和ACK要分开发送。只有等到Server端所有的报文都发送完了,服务器端才能发送FIN报文,因此不能一起发送。故需要四步握手。

综上,三次握手其实是减少了一个步骤,第二步将ACK和SYN报文一起发送了,所以少了一步

TIME-WAIT存在的两个理由:

可靠地实现TCP全双工连接的终止。(重发可能丢失的ACK报文,第四步)

虽然双方同意关闭连接,而且挥手的四个报文也已经发送完毕了,按理来说已经可以回到CLOSED状态了,但是,你别忘了,网络是不可靠的,所以无法保证客户端最后发送给服务器的ACK报文一定会被服务器收到,所有有可能服务器处于LAST_ACK状态的SOCKET可能会因为超时未收到ACK而重新发送FIN报文。

允许老的重复的报文在网络中消失(使本连接持续的时间内产生的所有报文从网络中消失)

为什么不能两次握手就搞定?

死锁

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值