tcp/ip协议及三次握手和四次挥手

tcp/ip基本结构

点击直达 —> TCP/IP基本结构
这里写图片描述

三次握手与四次挥手

三次握手与四次挥手是在传输层进行的。

一. 名次解析

SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
establish 建立,创建

二. 三次握手

这里写图片描述
1.建立连接,设置SYN标志位为1。client向server传递如下信息:
[SYN] SEQ: 1000, ACK: -
含义: 现传递的数据包序号为1000, 如果接收无误,请通知我向您传递1001号数据包
client —————>server
2.server接收到消息后,向client传输如下信息:
[SYN+ACK]: SQE: 8000, ACK: 1001;
- 现传递的数据包的序号为8000,接收无误后请通知我传输seq为8001号数据包
- 已经接收到1000数据包,请传输给我1001号数据包。
server—————>client
3.client接收到消息后,向server传输如下信息:
[ ACK ]: SEQ: 1001, ACK: 8001;
- 已经收到8000号数据包,现在可以传输8001号数据包
client —————>server

三 . 数据交换
  1. client 传递编号为1001的20个字节的数据包给client。并告诉其可以传递编号为8001的数据包
  2. server传递编号为8001,大小为10字节的数据包给client,并告诉其可以传递编号为1022的数据包
    ACK号 ->SEQ + 传递的字节数 +1;
  3. client收到编号为8001的数据包后,传输ACK8012,告诉其可以传递编号为8012的数据包
    如果超时将会进行重传数据包

四. 四次挥手

1.client 告知服务器 它想中断链接,消息如下:

  • [ FIN ]: SEQ:1021,ACK:8011

2.server告知服务它收到了消息,准备关闭链接:

  • [ ACK ]:ACK:1022;

3.server告知服务器,关闭链接准备就绪,发送:

  • [FIN + ACK]: SEQ: 8011, ACK: 1022;

4.client 告知服务器,它收到消息,发送:

  • [ACK]:ACK:8012

服务器关闭链接, 经过2MSL后客户端关闭链接。

五.经典问题

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

【问题3】如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

猜你喜欢

转载自blog.csdn.net/lay136362687/article/details/81430090