TCP的三次握手

1、TCP的首部结构组成如下:
源端口 source port、目的端口 destination port、序号 sequence number、确认号 acknowledgment number、数据偏移 offset、保留 reserved、标志位 tcp flags、窗口大小 window size、检验和 checksum、紧急指针 urgent pointer、选项 tcp options。
其中标志位解释如下:
URG:标志位为 1 时,表示有需要紧急处理的数据。
ACK:标志位为 1 时,表示确认应答有效。
PSH:标志位为 1 时,表示将数据立即上传给应用程序,而不是在缓冲区排队。
RST:标志位为 1 时,表示 TCP 连接出现异常,必须强制断开连接。
SYN:标志位为 1 时,表示请求建立连接,并设置序列号的初始值。
FIN:标志位为 1 时,表示数据发送结束,请求断开 TCP 连接。
在这里插入图片描述
2、三次握手
2.1、三次握手流程
在这里插入图片描述
第一次握手:客户端向服务端发送报文,表示请求连接,标志位SYN=1,同时生成随机序号seq(sequence number) = p,此时客户端处于SYN_SEND状态。

第二次握手:服务端收到报文后,应答客户端,标志位SYN=1,ACK=1,确认号ack(acknowledgment number)= p + 1,并生成序号seq = q,此时服务端处于SYN_RCVD。

第三次握手:客户端收到服务端确认消息后,客户端处于established状态。发送ACK=1,确认号ack=q + 1,进行确认,并建立会话。服务端收到确认消息后,也处于established状态,服务端可以向客户端发送消息。

注:带有SYN标志的过程包是不可以携带数据的,第一次和第二次握手无法携带数据,因为SYN就是请求连接的标识,有SYN就表明还未建立连接,第三次未携带SYN,并且客户端收到确认消息后,已处于established状态,已经可以发送消息了。

2.2、三次握手在应用中的时机
// 创建服务端socket准备就绪
ServerSocket serverSocket = new ServerSocket(8080);
1、客户端连接到指定的服务器端口
new Socket(“localhost”,8080);
2、服务端收到客户端请求
serverSocket.accept();
3、客户端收到响应,客户端建立连接,并向服务端确认
// 客户端返回socket的值,之后可发送数据
Socket socket = new Socket(“localhost”,8080);
// 服务端收到确定消息后,建立连接,返回socket值,之后可发送数据
Socket socket = serverSocket.accept();

2.3、三次握手的类比:
两台主机,可以理解为在两山头的两个人,距离比较远,不确定对方能否听到,假设山头的两个人分别叫张三(客户端)和李四(服务端)。
第一次握手:

张三:李四,你在吗(他需要等李四的回复,保证李四听到了他的话,UDP不需要等回复)
情况1:李四可能在忙其他的,没有听到(网络问题),连接建立失败
情况2:李四刚好在山头(网络正常)。但是李四不知道张三知道自己在山头,并且自己能听到张三的话。所以需要他进行回复

第二次握手:

李四:我在,你能听到我说话吗
情况1:可能李四到张三的山头是逆风,李四的话,张三听不到(网络问题),张三迟迟未收到李四的回复,以为李四不在,连接建立失败。
情况2:张三听到了李四的回复,这时,只有张三心里明白,双方的通话没问题。但是李四不知道张三能听到自己的回复,所以张三需要回复,让李四知道,我(张三)也能听到你(李四)的话。但是这个话,不一定是确认信息,可以是张三原先要告诉李四的内容,因为即使是内容,李四也能明白,张三可以听到自己说的话,等同于消息内容和确认消息,一起发给了李四

第三次握手:

张三:我也能听到你说的话(或具体的内容,携带了确认信息ACK)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值