| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 【无标题】初识TCP,实验加抓包带你理解为什么需要三次握手、四次挥手 -> 正文阅读 |
|
[网络协议]【无标题】初识TCP,实验加抓包带你理解为什么需要三次握手、四次挥手 |
前言 在前面的第二篇讲过一个通信的流程,里面提到了三种应用,HTTP、DNS、以及DHCP,这些呢,都是属于应用层的应用程序,正式因为越来越多的应用程序的出现,丰富了整个网络世界,对于学习路由交换数通技术来说,应用程序不是重点,特别对于新手来说,了解下常见的协议以及常见端口号的即可。而对于传输层来说,把TCP、UDP的特点、工作流程掌握,有个一定的认知,否则讲解的越多,对初学者来说会吸收不了,犯迷糊,建议是后续在随着知识点深入后,在回过头把TCP/IP协议框架看一次,你会发现又不一样的体会跟收获。 ?常见的应用程序端口号与作用 应用程序在如今的网络非常非常多,初学者先掌握常见的端口号以及它们的作用,至于原理,后续会讲解几个路由交换上面也常用的,其他应用建议在有一定的路由交换功底后,在花费时间去学习下。 这些应用协议很多在我们生活中经常遇到,经常使用的163、QQ等邮箱,使用的则是SMTP、POP3、IMAP4协议,而浏览器浏览各种网页、视频使用的是HTTP与HTTPS,当在某个应用输入域名(比如baidu.com),则需要好DNS来提供解析成对应的IP,又或者当我们手机连接WIFI后,就能直接上网,则是DHCP为终端分配了IP、DNS等参数。对于这些应用,目前了解下端口号以及作用,会随着知识点的深入,慢慢的都接触到。 竟然应用程序都以不同的端口号来区分,那假设网络中大家的用程序使用了自己觉得好记的端口号,那是不是就可能会造成冲突了呢?所以针对这种情况,端口号的分配有一个专门组织来管理,IANA(互联网号码分配机构),这个组织负责端口号的注册分配情况,如果某一个端口号已经被分配了,那在来注册这个端口号的应用则被拒绝,并且IANA把端口号分为了三类。(IP地址分配也是这个机构)
除了端口号以外,还有一个比较值得关注的就是,在应用协议分类里面还会分为TCP、UDP两种传输层协议,为什么要分两种协议呢,不能都是TCP或者使用UDP完成吗,他们有什么的特点?接下来先进入TCP的世界。 进入TCP的世界 之前学习了IP协议的特性,它是一个无连接,不可靠的协议,这个可能大家不太理解
正是因为这样的原因,有些应用是必须保证可靠性、跟按顺序接收的,否则得到的结果大不一样,所以TCP/IP的另外一个重要的协议就解决了这个问题,这就是TCP协议。? (1)什么是TCP 先了解下TCP的功能,TCP是面向连接、可靠、基于字节流的传输层通信协议。
这些特性是不是就是IP协议所不具备的,或者说解决了IP协议的缺陷。 (2)熟悉TCP协议头部格式 熟悉下TCP的头部格式,重点部分会用颜色标识出来,其他字段作为初学者可以跳过。 源目端口号:通常源端口号为随机端口号,访问者随机生成,而目的端口号用于表示访问上层的应用程序具体的端口,比如80就是http,443就是https。 序列号:计算机在发送数据之前,会与对方建立一个TCP的连接,在建立连接的时候会生成一个随机数作为初始值,通过SYN包传给对端,每发送一次数据,就累加一次,作用就是用来解决网络数据包乱序的问题。 确认应答号:表示下一次期望收到的数据的序列号,并且发送端在收到这个确认应答以后,可以根据序列号来判断,这个序号之前的数据已经正常接收,这个字段用于解决网络中丢包等问题。? 控制位:控制位总共有6个,主要需要知道的有4个。
字段了解完毕了,上面介绍的就是需要了解的,但是光看字段是不是很抽象,下面就来实际体会下TCP的建立。 (3)TCP的是如何建立的 TCP是面向连接的协议,在正式使用TCP之前,必须先建立一个连接,TCP建立连接通过三次握手来实现 按图设置好地址、开启服务,开启抓包(记得启动设备),中间必须加一个交换机,否则无法抓包。 通过HTTP客户端访问192.168.255.2服务器提供的WEB访问 主要放在前面三个包,这个就是TCP建立的三次握手。
最开始,客户端与服务器都是出于CLOSED状态,服务器由于跑了WEB服务,会主动去监听对应的端口号,变成LSTEN状态。客户端想要访问服务器,会随机初始化序列号(Client_isn,这里为6509),把这个序列号放入头部的序列号字段中,同时把SYN标志变成1,用于表示这个是SYN报文,然后发送给服务器,告诉服务器,我要跟你建立连接,发送完成后,客户端状态变成SYN-SENT。
服务器收到客户端的SYN后,首先服务器也生成一个随机的序号(Server_isn,这里为7773),这个序号填入TCP头部的序列号字段中,另外确认应答号填入(Client_isn+1,6509+1),最后把控制位的SYN与ACK标志变成1后发送给客户端。
客户端收到服务器的报文后,还需要发送最后一个应答报文,于是将TCP头部的ACK标志位变成1,紧接着确认应答号字段填写Server_isn+1(7773+1),最后把这个报文送给服务器,发送出去后,客户端的状态变成ESTBLISHED。 服务器收到客户端的应答报文后,也进入ESTABLISHED状态,至此双方都进入ESTABLISHED状态,三次握手完成,连接已经建立,客户端与服务器就可以相互发送数据了。?
(2)TCP为什么一定要三次握手,目的是什么?
通过上面的图就可以看出来,虽然第二个包服务端也就回复了SYN与ACK,但是服务端并不能确认这个包是否抵达了客户端,假设只有两次握手,当客户端的SYN请求发送出去了,但是由于网络问题被丢弃或者服务器回应的ACK没有收到,会重新发送SYN,由于没有第三次的握手存在,服务端不清楚客户端是否收到自己的ACK确认了,导致的情况是每收到一个SYN就建立一个连接,这样会导致服务端建立多个无效的连接,占用了设备的资源,更容易被恶意攻击。 (3)简单看看,TCP如何保障应用的可靠性的 来看看红色标记中的三个包,一个是客户端请求的HTTP数据,一个是服务端响应的,加一个ACK。 为了方便理解,我们就用抓包软件给的相对值来看,这样看起来清晰些,随机值可能一眼看过去有点迷糊,需要计算。?
最后客户端收到服务器的响应后,回复ACK,表示收到了。
(4)TCP又是如何断开的呢? ??如果客户端与服务器的数据已经发送完毕,一段时间内不在发送数据了,TCP建立的连接通道会占用服务器的性能,所以TCP规定,当应用服务不在有数据传输的需求时,应该断开连接,TCP断开的方式是通过四次挥手。
其实仔细看了上面的过程,就理解为什么需要四次了。
TCP的option? MSS
在TCP三次握手建立的时候,通常是会协商双方的MSS值的,当TCP发现数据超过MSS时,就会先进行分片,保证在打上TCP头部,以及IP头部的长度后不大于MTU值,这样来避免IP分片。 TCP分片后,如果某一个分片丢失,TCP会重发丢失部分的MSS,而不用重传所有分片,这样大大的提高了效率。(补充:MSS分片是都具有TCP头部,所以可以针对某一片重传。因为发送方没有收到对方对应部分的ACK应答,会进行重传,这就是TCP层的可靠性保障跟数据交付。)? 最后补充下,TCP中的数据称为段,就跟IP层为包,数据链路层为帧一样,但是在实际交流中,更多会称呼为数据包。 (6)怎么才算一个TCP连接呢?
有没有这样的可能,端口号最大只有65535,可能在某个时刻,同时访问服务器中就有相同的源端口号,因为目的端口号是服务器提供的服务端口号,都是相同的,这个时候服务器收到以后没法确认一个唯一的TCP连接,因为端口号都一样,所以确定唯一TCP连接是包含四元组:源地址、目的地址、源端口号、目的端口号
Windows命令行学习 在Windows中可以通过netstat开查看当前PC或者服务器的TCP网络连接情况 可以通过/?看帮助命令 可以查看本机就有这么多在侦听的端口号,为什么会侦听呢?就是因为开了对应的服务,就会侦听,当有数据包过来访问的是某某端口号,就交给对应侦听端口号的上层应用处理。 抓包的小技巧 抓包中软件会生成一个相对随机值,方便我们查看,但是新手朋友很容易把这个值当成了TCP序列号本来就是这个样子的,更糟糕的可能认为客户端与服务器的序列号是一样的,所以可以在抓包中关闭这个选项 右击,协议首选项----transmission Control protocl----红色框框的√去掉 这个时候看,序列号就成了随机的了 流类型选择【TCP Flod】就可以只看TCP的了,能够完整的看到整个TCP的状态以及序列号与ACK的交互过程,建议save as导出看起来更加清晰。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:18:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |