TCP 协议


前言

java 开发多年,一直对tcp 网络协议一知半解,作此篇记录下,不正之处 往诸君指正;


一、OSI 七层协议模型

常说的tcp/ip 协议,说到这不得不说一下 OSI 七层协议模型;具体见下图
在这里插入图片描述

二、TCP

1.报文格式

报文见下图
在这里插入图片描述

  • 端口号 : 代表的是传输到服务器的那个应用;
  • 32 位序号: 数据包的序号,标识是哪个报文;
  • 确认序号: 标识应答的是哪个报文;
  • SYN/ACK/FIN : SYN 代表是握手; ACK 代表是应答;FIN 代表是挥手;

2.三次握手

在这里插入图片描述

  1. 客户端发送握手连接报文,标识为SYN 序号seq,开始第一次握手,并消耗掉一个 seq;
  2. 服务端响应第一次握手报文 (标识为ACK),同时发送握手报文 SYN; 同时发送掉一个新的seq,开始第二次握手;
  3. 客户端收到服务端的ack 报文,同时接收服务端发来的syn 报文,并响应服务端的握手确认报文,开始第三次握手;

在这里插入图片描述

思考: 这里非要三次握手吗? 两次可以不呢?

3.四次挥手

在这里插入图片描述

  • 客户端发送关闭连接报文,标识为 FIN, seq=xxx ,开始第一次挥手;
  • 服务端收到挥手请求,并应答客户端的挥手报文,返回一个应答ack,开始第二次挥手,如果没有数据传完,则也带上数据,只到数据传输完毕;
  • 服务端发送一个挥手报文,开启第三次挥手;
  • 客户端应答服务端的挥手报文ack, 服务端收到ack 后,关闭服务端连接;

思考: 为什么握手只需要三次,而挥手却要4 次呢?


总结

思考一
网上有诸多答案,有说为了历史连接 重连的时候不去重复创建新链接的, 有说为了丢包后重试起来而进行第三次握手的; 众说纷纭;
以我个人理解,如果只有2次握手的话 只能证明 客户端知道和服务器是能正常收发消息的;而缺少第三次报文的话,服务端是没法确认服务端发送的消息客户端能收到的;

思考二
四次挥手 只有当客户端和服务端的数据都传输完毕了才进行挥手,之所以比握手多了一次就是需要将服务端的数据传输完毕给客户端,才多了一次挥手;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值