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

TCP三次握手过程

什么是TCP

tcp是一个面向连接的、可靠的、基于字节流的传输层通信协议

  • 面向连接:TCP连接是一对一的,不能实现一对多或多对一,TCP在通信前要首先建立连接,连接成功后才能开始进行通信
  • 可靠的:TCP连接要保证通信过程的可靠性,所谓可靠性是指TCP能够检查比特错误并纠正比特错误,同时能够对丢包、失序情况作出一定的应对。
  • 基于字节流:

为什么需要TCP

由于下层网络层(IP层)不保证网络包的交付、按序交付和数据的完整性,因此需要TCP协议在运输层保证数据传输的可靠性。

TCP报文头格式

各字段作用:

  • 序列号:连接建立时该值是随机初始化的。其后在数据传输过程中,TCP 连接中传送的数据流中的每一个字节都编上一个序号,而序号字段的值则指的是本报文段所发送的数据的第一个字节的序号,以保证数据传输过程中不乱序。用来解决网络包的失序问题
  • 确认应答号:指期望收到对方的下一个报文段的数据的第一个字节的序号,发送端在收到确认应答后可认为在该序号之前的数据都已经被接收端正常接收。用以解决网络丢包的问题
  • 控制位:
    • ACK,该位为1时,确认应答号有效
    • SYN,该位为1,连接建立号,建立TCP连接所使用特殊字段,该位为1表示希望建立连接
    • FIN,同SYN字段的作用,是TCP断开连接时需要的特殊字段,该位为1表示希望断开连接
    • RST,该位为1,表示出现异常情况,需要强制断开连接
  • 源端口与目的端口:用于告诉TCP协议应该把网络数据包交给哪个进程
  • 首部长度:指出TCP报文的首部长度,单位为4字节,取值范围为0~15,故而TCP报文段的首部长度最大为60字节,固定字段为20字节,因此选项部分最大为40字节

如何确定一个TCP连接

一个TCP四元组可以确定一个TCP连接,其四元组组成为:

其中,源地址与目的地址在IP头部中,作用是将数据包通过IP协议发送给主机

源端口与目的端口存在于TCP头部中,作用是告诉TCP协议应该把报文发送给哪个进程

TCP建立连接的过程

TCP在通信前需要首先通过三次握手建立连接,之后才能进行通信,其过程如下:

  • 第一次握手:客户端发送SYN报文段,在tcp头部中,置SYN=1,并随机初始一个seq序号,但不携带任何数据。表示客户端要建立连接
  • 第二次握手:服务端收到客户端发来的链接请求后,在tcp头部中,置SYN=1,也随机初始化一个服务端的序号seq放入tcp头部,同时置ACK=1,对客户端也响应一个确认号ack放入头部,该阶段同样不携带数据。表示服务端同意建立连接
  • 第三次握手:客户端收到服务端的同意链接请求报文,此时服务端已经做好了要连接并发送数据的准备,要对服务端发送一个确认报文。在tcp头部中,置ACK=1,但SYN=0,且此后的数据传输过程中SYN都等于0,同时对服务端的序号响应一个确认号,在该阶段,客户端可以携带数据发送给服务端

参考:
4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Linux】24、文件系统、磁盘 IO
  • HuggingFace学习笔记--利用API实现简单的NLP任务
  • Unity UGUI控件之Horizontal Layout Group
  • shareMouse 使用中遇到的问题
  • Vue3集成ThreeJS实现3D效果,threejs+Vite+Vue3+TypeScript 实战课程【一篇文章精通系列】
  • [FUNC]判断窗口在哪一个屏幕上
  • docker 安装nginx
  • 【华为OD题库-056】矩阵元素的边界值-java
  • 如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】
  • 04 # 第一个 TypeScript 程序
  • 解决VSCode按住Ctrl(or Command) 点击鼠标左键不跳转的问题(不能Go to Definition)
  • Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)
  • okhttp导致的内存溢出(OOM)sun.security.ssl.SSLSocketImpl
  • 西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分
  • day3 移出链表中值为x的节点
  • 【译】JS基础算法脚本:字符串结尾
  • 【EOS】Cleos基础
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 4个实用的微服务测试策略
  • Apache的80端口被占用以及访问时报错403
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • express + mock 让前后台并行开发
  • mongodb--安装和初步使用教程
  • ng6--错误信息小结(持续更新)
  • Promise面试题2实现异步串行执行
  • python学习笔记-类对象的信息
  • session共享问题解决方案
  • 从tcpdump抓包看TCP/IP协议
  • 给初学者:JavaScript 中数组操作注意点
  • 前嗅ForeSpider采集配置界面介绍
  • 时间复杂度与空间复杂度分析
  • 微信开放平台全网发布【失败】的几点排查方法
  • 赢得Docker挑战最佳实践
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​Java并发新构件之Exchanger
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #100天计划# 2013年9月29日
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $ git push -u origin master 推送到远程库出错
  • (27)4.8 习题课
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (windows2012共享文件夹和防火墙设置
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (多级缓存)缓存同步
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (回溯) LeetCode 131. 分割回文串
  • (十一)c52学习之旅-动态数码管
  • (转)创业的注意事项
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net Core 中间件与过滤器
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化