当前位置: 首页 > news >正文

网络通信深入解析:探索TCP/IP模型

  http协议访问web

        你知道在我们的网页浏览器的地址当中输入url,未必是如何呈现的吗?

        web浏览器根据地址栏中指定的url,从web服务器获取文件资源(resource)等信息,从而显示出web页面。web使用HTTP(超文本传输协议)的协议作为规范,完成从客户端从服务器端等一系列的运作流程。了解HTTP,我们有必要事先了解一下TCP/IP传输。

        发送端在层与层之间传输数据时,每层就会被打上一个该层所属的首部信息,反之,接收端在层与层传输数据时,每经过一层就会把对应的首部消去。这种吧数据包装起来的做法称为封装。

TCP报文的首部格式

        在介绍TCP连接之前先介绍下TCP的报文,TCP报文是面向字节流的,分为首部和数据两部分,TCP首部如下所示,固定20字节:

  • 源端口和目标端口:各占2字节
  • 序号seq:标记报文段的顺序,值代表该报文段所携带的数据的第一个字节的编号
  • 确认号ack:占4个字节,表示期望收到对方下一个保温段的第一个字节的序号
  • 确认标志位ACK:ACK=1时,ack才有效
  • 同步标志位SYN:建立TCP连接时用的同步序号。当SYN = 1时,ACK = 0时表示:这是一个连接请求报文段。若同意连接,则相应报文中使得SYN = 1,ACK = 1。SYN这个表示位只有在TCP连接时才会被置为1,握手完成后SYN标志位置为0。
  • 终止标志位FIN:表示要释放一个连接。FIN = 1表示报文的发送方的数据已经发送完毕,要求释放连接。与SYN的作用刚好相反。
     

tips:ACK、SYN、FIN这些大写的单词都表示标志位,要么置为1,要么置为0;而ack、seq小写单词表示序号。

三次握手

        HTTP属于应用层、TCP属于传输层、IP属于网络层。客户端和服务器端都需要知道各自可收发,因此需要三次握手。如下图所示:

  1. 第一次握手:服务器器知道客户端具有发送能力(SYN=1)
  2. 第二次握手:客户端知道服务器具有接受和发送的能力,但是服务器不知道客户端是否具有接受能力,所以需要第三次握手(ACK=1,SYN=1)
  3. 第三次握手:服务器端知道客户端具有接受能力了,之后开始通信(ACK=1)

三次握手过程可以携带数据吗

  • 第一次、第二次还不能携带数据,因为还没有建立连接,会让服务器容易受到攻击
  • 第三次握手时候客户端已经处于已建立连接的状态,并且已经知道服务器端的收发能力所以可以携带数据。

四次挥手

  1.  客户端要求断开连接,发送FIN:断开连接请求
  2. 服务器端接受到请求,返回給客户端ACK,作为FIN响应
  3. 这个时候服务器不能立马传递给服务器FIN,服务器需要确认之前发送的消息都已经处理完毕得到ACK之后再断开。因此断开连接不能像握手一样两跳信息合并。所以服务器需要经过一个等待,确定可以关闭连接了之后再发送一条FIN给客户端
  4. 客户端收到服务器的FIN,同时客户端也可能有自己的事情处理完,比如客户端没有接收到服务器端的ACK请求,客户端处理完成后再给服务器端发送ACK

为什么需要四次挥手

        只有服务器端的服务器发完之后才会给客户端发送FIN断开请求,告诉客户端可以断开连接了,所以需要四次挥手。

  • 收到FIN仅仅代表客户端没有数据发送给客户端了,但是客户端可能还有未处理完毕的信息
  • ACK分开发送的,所以需要等待一段时间处理完毕信息,再断开连接,发送FIN给客户端告知客户端可以断开连接,客户端收到ACK之后才会断开

参考

图解http

前端进阶之旅

TCP的三次握手与四次挥手_关于tcp三次握手正确的是fin是终止_crazy的蓝色梦想的博客-CSDN博客

http://www.lryc.cn/news/160678.html

相关文章:

  • 可靠的可视化监控平台应用在那些场景?
  • 从 BBR 失速到带宽探测
  • MobaXterm使用sz/rz命令下载上传文件
  • vue el-popover hover延时触发,el-popover 鼠标放上三秒以后触发
  • 计算机竞赛 基于深度学习的人脸识别系统
  • Android扫码连接WIFI实现
  • TrOCR – 基于 Transformer 的 OCR 入门指南
  • MAC终端美化
  • Matlab常用字符串操作教程
  • 基于SSM的汽车养护管理系统
  • Redis发布订阅机制学习
  • 施展世界:GPT时代需要的教育,是学会如何提出好问题
  • Excel学习 WPS版
  • MySQL的Json类型个人用法详解
  • VUE 程序的执行过程(非常非常重要)
  • 指定cv::cuda::GpuMat创建所在的GPU卡
  • Camunda 7.x 系列【43】事务子流程
  • vscode设置的json的配置(个人怕忘了做个记录,各位不用看)
  • HJ17 坐标移动
  • 【postgresql基础入门】 新建数据库服务集群目录,定制属于自己的独享数据区
  • 808协议是指中国国标GB/T 32960-2017《道路车辆运行数据远程监管与服务》通信协议,也被称为JT/T808协议
  • DDD 与 CQRS 才是黄金组合
  • 运维Shell脚本小试牛刀(八): case模式忽略命令行参数大小写演示
  • 【个人博客系统网站】项目的发布 · 通过公网IP访问我们的网站 · 思考总结
  • 网络类型(通信分类)
  • python基础语法(一)
  • C语言学习笔记——常见问题
  • 使用GPU虚拟化技术搭建支持3D设计的职校学生机房(云教室)
  • 【C++入门】C语言的不足之处
  • 【已解决】oracle获取最近2学年的数据