TCP数据报结构以及三次握手(图解)
下文对计算机socket编程的讲解通俗易懂,对我自己回顾以前的知识,以及学习很有帮助,感谢原作的分享!在此转载。
原文地址:http://c.biancheng.net/cpp/html/3042.html
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以形象的比喻为下面的对话:
- [Shake 1] 套接字A:“你好,套接字B,我这里有数据要传送给你,建立连接吧。”
- [Shake 2] 套接字B:“好的,我这边已准备就绪。”
- [Shake 3] 套接字A:“谢谢你受理我的请求。”
TCP数据报结构
我们先来看一下TCP数据报的结构:
带阴影的几个字段需要重点说明一下:
1) 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
2) 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
3) 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
- URG:紧急指针(urgent pointer)有效。
- ACK:确认序号有效。
- PSH:接收方应该尽快将这个报文交给应用层。
- RST:重置连接。
- SYN:建立一个新连接。
- FIN:断开一个连接。
对英文字母缩写的总结:Seq 是 Sequence 的缩写,表示序列;Ack(ACK) 是 Acknowledge 的缩写,表示确认;SYN 是 Synchronous 的缩写,愿意是“同步的”,这里表示建立同步连接;FIN 是 Finish 的缩写,表示完成。
连接的建立(三次握手)
使用 connect() 建立连接时,客户端和服务器端会相互发送三个数据包,请看下图:
客户端调用 socket() 函数创建套接字后,因为没有建立连接,所以套接字处于CLOSED
状态;服务器端调用 listen() 函数后,套接字进入LISTEN
状态,开始监听客户端请求。
这个时候,客户端开始发起请求:
1) 当客户端调用 connect() 函数后,TCP协议会组建一个数据包,并设置 SYN 标志位,表示该数据包是用来建立同步连接的。同时生成一个随机数字 1000,填充“序号(Seq)”字段,表示该数据包的序号。完成这些工作,开始向服务器端发送数据包,客户端就进入了SYN-SEND
状态。
2) 服务器端收到数据包,检测到已经设置了 SYN 标志位,就知道这是客户端发来的建立连接的“请求包”。服务器端也会组建一个数据包,并设置 SYN 和 ACK 标志位,SYN 表示该数据包用来建立连接,ACK 用来确认收到了刚才客户端发送的数据包。
服务器生成一个随机数 2000,填充“序号(Seq)”字段。2000 和客户端数据包没有关系。
服务器将客户端数据包序号(1000)加1,得到1001,并用这个数字填充“确认号(Ack)”字段。
服务器将数据包发出,进入SYN-RECV
状态。
3) 客户端收到数据包,检测到已经设置了 SYN 和 ACK 标志位,就知道这是服务器发来的“确认包”。客户端会检测“确认号(Ack)”字段,看它的值是否为 1000+1,如果是就说明连接建立成功。
接下来,客户端会继续组建数据包,并设置 ACK 标志位,表示客户端正确接收了服务器发来的“确认包”。同时,将刚才服务器发来的数据包序号(2000)加1,得到 2001,并用这个数字来填充“确认号(Ack)”字段。
客户端将数据包发出,进入ESTABLISED
状态,表示连接已经成功建立。
4) 服务器端收到数据包,检测到已经设置了 ACK 标志位,就知道这是客户端发来的“确认包”。服务器会检测“确认号(Ack)”字段,看它的值是否为 2000+1,如果是就说明连接建立成功,服务器进入ESTABLISED
状态。
至此,客户端和服务器都进入了ESTABLISED
状态,连接建立成功,接下来就可以收发数据了。
最后的说明
三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号 Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1
是否成立,如果成立说明对方正确收到了自己的数据包。
TCP数据报结构以及三次握手(图解)相关推荐
- 图解TCP数据报结构以及三次握手(非常详细)
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接. 客户端在收发数据前要 ...
- Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解
今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...
- 网络:七层,HTTP应用层、TCP传输层、IP网络层,拔网线TCP还在,三次握手保证双向与减少因延时传输错误
网络七层 应,表,会,传,网,数,物 HTTP应用层 TCP传输层 IP网络层 应用层 与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的.例如,一个没有通信功能的字处理程序就不能执行通信的 ...
- TCP建立链接的三次握手
TCP建立链接的三次握手 TCP是面向链接的协议,该协议主要是为应用层服务的,比如说FTP,HTTP等. 而TCP建立链接使用了三次握手. TCP报文段的头部格式如下: www.2cto.com ...
- startupinfo为什么需要初始化_为什么 TCP 建立连接要三次握手
为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...
- 为什么TCP建立连接需要三次握手
为什么TCP建立连接需要三次握手 很简单,因为TCP的目的是相对高效地建立可靠的连接. 虽然说2次握手,请求方就已经能够确认双方路径已经没有问题了.但是接受方这边接收到的信息却仅仅是,你发起了建立连接 ...
- mobaxterm为什么无法连接_为什么 TCP 建立连接需要三次握手
为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...
- 十人面试就我通过,只因我答对了这题TCP协议为什么需要三次握手
一位5年工作经验的小伙伴面试被问到这样一道面试题,说,TCP协议为什么要设计三次握手.当时这位小伙伴被问得哑口无言.后来,他找到我,说希望做一期视频分享一下.今天,我给大家分享一下我的理解. 1 TC ...
- TCP协议为什么需要三次握手?
TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?读者可以带着疑问,看一遍本篇博客的详细讲解 ok,首先解释原因之前还是要先复习一下TCP的基本知识和三次握手协议: 1.什么是TCP ...
- TCP建立连接的三次握手
TCP建立连接的三次握手 TCP头的构成 TCP建立连接的过程就是三次握手,三次握手成功完成,TCP连接就建立了.在三次握手之前先看一下TCP报文中的TCP头由哪些部分组成. 上图中有几个字段需要重点 ...
最新文章
- Spring Boot 2.1之后如何在启动日志中打印请求路径列表
- python实现滑块验证功能_python3.8.1+selenium实现登录滑块验证功能
- oracle logminer java_Oracle logminer
- C++:28 --- C++内存布局(上)
- java创建型_Java创建型模式
- no.7_qzhai 开心版_开心宝贝GM版下载-开心宝贝GM版安卓下载
- 如何编写Ruby控制台程序(一)
- bzoj 2850 巧克力王国 —— K-D树
- oracle sql 执行计划分析_从Oracle数据库实验来看索引的常见执行计划
- bootstrap49-Bootstrap 分割的按钮下拉菜单
- 【定位问题】基于matlab GUI RSSI无线定位【含Matlab源码 1054期】
- 语音聊天室 anyHouse 使用手册
- DB2 SQLCODE常见错误代码
- 安卓辅助功能获取控件id
- python小技巧之:同时安装py2和py3,如何在指定的版本下pip安装包
- 用pygame做经典坦克大战游戏(附源码)
- 沐风微信营销水库模型二:建设专属秘密武器库!
- 博士毕业去县城工作,如何是你,怎么选?
- 第三种是经典著作阅读法
- CGI简介用C来写CGI程序简要指南
热门文章
- odoo13 订单模板设置_ERP输出嵌入公章的采购订单电子档,其实真的不难
- 丁可以组什么词_“一”可以组什么词?落语读书会学期总结
- 查看linux的iso文件名,查看ISO文件信息
- unity3d技术摄像头跟随_天尚元无人驾驶技术应用丨环卫清扫车
- mysql拼装字段_Mysql 实现字段拼接的三个函数
- c语言转换yyyy年mm月,C语言求教 输入一个日期(格式:YYYY/MM/DD),要求输出这个日期对应星期几 有些年分无结果?...
- 客户机操作系统已禁用 cpu_强实时工业互联网虚拟化操作系统Intewell
- ProGuard编译与使用
- DevExpress.XtraEditors.Repository.RepositoryItem.CreateDesigner()
- 博客随笔《文章目录——java》大纲