大厂面试中三次握手延伸出来n连发你受得了?
目录
秋招面试也不记得多少家公司会有这个面试题。所以将其总结一下并分享给大家。
@
嘀嘀嘀。。。。一看广东,难道是腾讯的面试,哦原来是电话面试。那就开始吧!
一、这是一次有故事的对话
先说说三次握手的各个状态
二、三次握手的客户端服务端状态
1 先画个图看看有哪些状态
嗯?这些ack seq是干啥的呢,不急不急,我们先把tcp协议格式内容给整明白了。
2 tcp协议内容解析
- 小贱先把tcp的头部搬过来
- 然后我们来解析一下各个字段是什么意思
字段名 | 字段描述 |
---|---|
16位端口号 | 告知主机该报文是来自哪里以及传给哪个上层协议或应用程序(目的端口)的。 |
32位序列号 | 一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号 |
32位确认号 | 用作对另一方发送来的TCP报文段的响应 |
4位头部长度 | 标识该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。 |
标志位URG | URG标志:表示紧急指针是否有效。 |
标志位ACK | ACK标志:表示确认号是否有效。我们称携带ACK标志的TCP报文段为确认报文段 |
标志位PSH | PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。 |
标志位RST | RST标志:表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。 |
标志位SYN | SYN标志:表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文。 |
标志位FIN | FIN标志:表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。 |
16位窗口大小 | 是TCP流量控制的一个手段。告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度 |
16位校验和 | 由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏 |
16位紧急指针 | 是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号 |
3 通过工具wireshark来验证我们所述
- 打开wireshark,设置捕获网卡。
- 解析
第1次握手:建立连接时,客户端发送 SYN 包到服务器端,携带一个序列码给服务器端用于确认,并进入 SYN_SEND 状态,等待服务器端确认。(发起连接状态)
第2次握手:服务器端收到 SYN 包,首先确认客户的SYN,并对序列码加1处理,发送一个自己的SYN包,携带一个自己的序列码,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。(连接接收状态)
第3次握手:客户端收到服务器端返回的 SYN+ACK 包,向服务器端发送确认包 ACK,并对服务器端的序列码进行加1处理,此包发送完毕,两端进入 ESTABLISHED 状态,完成三次握手,之后服务器端和客户端就开始进行数据传输。(建立连接状态)
再说说Linux网络编程的API
三、说下Linux网络编程常用API
1 Linux网络编程常用API
这里至少需要知道下面的API接口。另外如果实力允许,也可以谈谈阻塞非阻塞,多路复用的select,poll,epoll等内容。
2 粘包现象
假设我们想将下面两句话连续发给服务器。
(1) i respect you
(2) you respect me
ok,那么对于服务器来说,总会有可能接收到诸如"i respect youyou respect me",这下服务器就懵了,这是啥?,因为咋们没有签订一个这样结构的协议,所以就需要分包,那么怎么分也需要去组织一个比较好的结构。通常一个方法是可以在包头存储需要发送数据的长度,以确保接受。
四、再说说为啥不是两次握手或者四次握手?
为什么不是四次握手?下面模拟一次男女有对话
男友小蓝:亲爱的你能听见我说话?下午去听"房东的猫"演唱会(具有发送能力)
女友小小:嗯嗯,听得到,狗子能听见我的声音吗?(具有接受能力,发送能力)
男友小蓝:能听见,亲爱能听见吗(具有接受能力)
女友小小:嗯?你是蓝憨憨?我不说了我听得见,是不是非要我再说一篇!!是想一个人去听演唱会?
哈哈哈,这就是四次握手,多做了一次无用功。一定牢记只需要双方具有发送和接受的能力就足矣。
为什么不是两次握手呢?我们继续模拟一次对话
男友小蓝:亲爱的你能听见我说话?(具有发送能力)
女友小小:我能听见的,你能听见我说话?(具有接受能力,发送能力)
好了,这里男友小蓝没有接受能力,女友说的话男友小蓝也就可能没收到。后续也就不知道怎么操作了!那到底会出什么问题呢?
假设在cientA第一次链接的过程中被阻塞了。如下图所示。那么这个时候因为没有收到server的应答,所以尝试重发,这次没有被阻塞就连接上server了。这个时候可以谈情说爱了,说完就断开了链接。
这个时候刚才被阻塞的client发现网络情况非常好了,就去链接server,server不管三七二十一,来了我就给你分配资源并回复你,两次握手完成了链接。但是好马不吃回头草呀,client以为你早就丢失了,所以不会和server进行数据的通信。这下完蛋了,server分配的资源白分配了,这就是浪费了服务器端的资源。那么此时网络超级差,server是不是有可能被耗尽资源呢?
五、最后聊一聊分析网络程序的工具
1 网络程序调试工具的思维导图
2 详解各个小工具
- tcpdump
和它类似的工具在windows中是wireshark,其采用底层库winpcap/libpcap实现。采用了bpf过滤机制。下面我们看看提供的不同参数的含义。
参数名 | 含义 |
---|---|
-n | 使用IP地址表示主机。使用数字表示端口 |
-i | 指定要监听的端口。如果为"-i any"表示住区所有网卡数据包 |
-v | 输出诸如ip数据包中的TTL更加详细的信息 |
-t | 不打印时间戳 |
-e | 显示以太网帧头部信息 |
-c | 仅仅抓取指定数量的数据包 |
-x | 按照十六进制显示数据包内容 |
-X | 不仅仅输出-x结果还输出十六进制对应的ASCII字符 |
-s | 设置抓包时的抓包长度 |
-w | 将输出结果定向到某个文件,一般为pcap后缀 |
-r | 从文件读取数据包并显示 |
知道了相关参数,下面看几个案例
执行任务 | 执行命令 |
---|---|
捕获特定网口数据包 | tcpdump -i eth0 |
捕获特定个数(1000)的包 | tcpdump -c 1000 -i eth0 |
将捕获的包保存到文件 | tcpdump -w a.pcap -i eth0 |
读取pcap格式的包 | tcpdump -r a.pcap |
增加捕获包的时间戳 | tcpdump -n -ttt -i eth0 |
指定捕获包的协议类型 | tcpdump -i eth0 arp |
捕获指定端口 | tcpdump -i eth0 post 22 |
捕获特定目标ip+port的包 | tcpdump -i eth0 dst address and port 22 |
捕获DNS请求和响应 | tcpdump -i eth0 -s0 port 53 |
匹配Http请求头 | tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:" |
- lsof
列出当前系统打开的文件描述符工具。可以得知感兴趣的描述符是被哪些进程使用
同样,我们看看相关参数
参数 | 描述 | 使用方法 |
---|---|---|
-i | 显示sokcet文件描述符 | lsof -i @ip:port |
-c | 显示指定的命令打开的所有文件描述符 | lsof -c processA(查看进程A打开了多少描述符) |
-t | 仅显示打开了目标文件描述符的进程pid |
老规矩,上几个例子
执行任务 | 命令 |
---|---|
列出所有的网络链接 | lsof -i |
列出所有udp的网络链接 | lsof -i udp |
列出谁在使用某个端口 | lsof -i :3306 |
列出谁在使用特定的tcp端口 | lsof -i tcp:80 |
根据文件描述范围列出文件信息 | lsof -d 2-3 |
- nc
nc-->“瑞士军刀”。不知大家在渗透过程中,拿了shell有没有使用nc搞点事儿。它用来快速构建网络链接。常用来调试客户端程序。
参数 | 描述 |
---|---|
-i | 设置数据包传送的时间间隔 |
-l | 以服务器方式运行。默认为客户端运行 |
-k | 重复接受并处理某个端口上的所有链接 |
-p | 以客户端运行时强制其使用指定端口 |
-C | 将CR和LF两个字符作为结束符 |
-u | 使用udp协议。默认tcp协议 |
-X | nc客户端余代理服务器通信时默认为socks5协议。 |
-z | 扫描目标机器某个范围服务是否开启 |
小贱上案例
执行任务 | 执行命令 |
---|---|
扫描机器A端口号在30-40的服务 | nc -z A 30-40 |
连接服务器A 端口号为5000 | nc -C A 5000 |
传送文件 | MachineA:nc -v -n ip port <D:\a.exe MachineB:nc -v -l -p port >E:\a.exe |
- netstat
netstat是一个网络信息统计工具。它可以得到网卡接口上全部了解,路由表信息,网卡接口信息等。通常在网络编程中我们用它来显示TCP连接以及状态信息。
参数 | 描述 |
---|---|
-n | 使用IP地址表示主机 |
-a | 显示结果中包含监听的socket |
-t | 仅显示TCP连接 |
-r | 显示路由信息 |
-i | 显示网卡接口数据流量 |
-c | 每隔1s输出一次 |
-o | 显示socket定时器的信息 |
-p | 显示socket所属的进程的PID和名字 |
下面列举几个常用例子
执行任务 | 执行命令 |
---|---|
列出所有连接 | netstat -a |
只列出TCP或者UDP | netstat -at/netstat -au |
列出监听中的连接 | netstat -tnl |
获取进程名、进程号以及用户 ID | nestat -nlpt |
打印统计信息 | netstat -s |
netstat持续输出 | netstat -ct |
打印active状态的连接 | netstat -atnp | grep ESTA |
查看服务是否运行(npt) | netstat -aple| grep ntp |
- vmstat
vmstat能够实时输出系统的进程信息,内存使用,cpu使用等资源的使用情况
参数 | 描述 |
---|---|
-f | 显示系统自启动以来执行的fork次数 |
-s | 显示内存相关统计信息 |
-d | 显示磁盘相关统计信息 |
-p | 显示指定磁盘分区统计信息 |
count | 采样次数。 |
看一下vmstat都有哪些输出字段。
| 字段名 | 描述 |
| ------ | ------------------------------------------------------------ |
| procs | r表示等待运行的而进程数目。b表示处于不可中断睡眠状态的进程数目 |
| memory | swpd:使用的虚拟内存量。free:空闲内存量。buff:用作缓冲区的内存量。cache:用作缓存的内存量。 |
| swap | si:从磁盘换入的内存量(/s)。so:交换到磁盘的内存量(/s)。 |
| io | bi:从块设备接收的块(blocks/s)。bo:发送到块设备的块(blocks/s)。 |
| system | in:每秒中断的次数,包括时钟。cs:每秒上下文切换的次数。 |
这里注意哈,如果查看磁盘的更加详细信息,有另外iostat所得到的信心就更加详细哟
- mpstat
能够实时监测多处理器系统中各个cpu的使用情况。这个命令的执行需要安装sysstat,在centos中执行yum install systat就好了。
然后我们看看各个字段什么意思。
字段 | 描述 |
---|---|
cpu | 表示当前条信息属于哪个cpu的数据 |
%usr | 进程运行在用户空间所占cpu运行时间的比例 |
%nice | nice值为负的进程运行在用户空间的时间占cpu总运行时间的比例 |
%iowait | cpu等待磁盘操作的时间占cpu总运行时间的比例 |
%irq | cpu用于处理硬件中断时间占cpu总运行时间的比例 |
%soft | cpu用于处理软件中断的时间占cpu用运行时间的比例 |
%steal | 一对虚拟cpu。当超级管理员在处理某个虚拟cpu时,另一个等待它处理完才能运行。这段等待时间表示为steal时间占总运行时间的比例 |
%guest | 运行虚拟cpu时间占cpu总运行时间的比例 |
%idle | 系统空闲时间占cpu总运行时间的比例 |
六 结尾
好了,今天文章就到这了,如果你读到这里了,老铁么么哒!非常感谢!
点关注,不跑路
文章会首于与微信,可以微信搜索[我是程序员小贱]第一时间查看。
后面每周都会更新几篇面试高频题目和自己总结的文章,如果觉得学到了一点东西,来个三连击,点赞,关注,分享。
创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
大厂面试中三次握手延伸出来n连发你受得了?的更多相关文章
- TCP协议中三次握手
TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...
- TCP中三次握手建立和四次握手释放以及相关问题
本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...
- 【大厂面试07期】说一说你对synchronized锁的理解?
synchronized锁的原理也是大厂面试中经常会涉及的问题,本文主要通过对以下问题进行分析讲解,来帮助大家理解synchronized锁的原理. 1.synchronized锁是什么?锁的对象是什 ...
- TCP/UDP协议、理解三次握手四次挥手、Socket
一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要 ...
- Java网络编程学习A轮_02_抓包分析TCP三次握手过程
参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...
- 让你彻底明白TCP三次握手,四次挥手
今天我们来讲一下TCP的三次握手和四次挥手,先来张思维导图. 一.TCP是什么 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流 ...
- 【大厂面试08期】谈一谈你对HashMap的理解?
摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...
- TCP 中的三次握手和四次挥手
Table of Contents 前言 数据报头部 三次握手 SYN 攻击 四次挥手 半连接 TIME_WAIT 结语 参考链接 前言 TCP 中的三次握手和四次挥手应该是非常著名的两个问题了,一方 ...
- <转载>面试官,不要再问我三次握手和四次挥手
版权声明:本文为CSDN博主「夏雪冬日」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/hyg0811/a ...
随机推荐
- Ubuntu Kylin 14.04安装
早听说Ubuntu Kylin对中国本地做了很多定制的工作,想搜狗输入法.WPS,还有中国日历等.昨天没事就下载了一个Kylin试用了下,使用的方法还是使用EasyBCD软件做了个硬盘安装启动,关于E ...
- linux 每-CPU 的变量
每-CPU 变量是一个有趣的 2.6 内核的特性. 当你创建一个每-CPU 变量, 系统中每个处理 器获得它自己的这个变量拷贝. 这个可能象一个想做的奇怪的事情, 但是它有自己的优点. 存取每-CPU ...
- Team Foundation Server 2015使用教程【5】:默认团队checkin权限修改
- 16python的map函数,filter函数,reduce函数
map num_l = [1,6,8,9] def map_test(func,array): ret = [] for i in array: res = func(i) ret.append(re ...
- Rust入坑指南:亡羊补牢
如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- $cometoj\#4\ D\ $求和 不是$dp$
\(Des\) \(Sol\) \(upd:\)以下两段是错误做法,但我不想删掉\(.jpg\) -----------------------以下是错误部分--------------------- ...
- .NET设计篇08-线程统一取消模型和跨线程访问UI
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入 内容目录 一.线程统一取消模型1.取消令牌2.可以中断的线程1.设计一个中断函数2.创建CancellationTokenSour ...
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- 导出 CVS
function ExportStoreInfoAction() { set_time_limit(0); $table = "xd_store"; $res = [[...].. ...