文章目录
一、这是一次有故事的对话
二、三次握手的客户端服务端状态
1 先画个图看看有哪些状态
2 tcp协议内容解析
3 通过工具wireshark来验证我们所述
三、说下Linux网络编程常用API
1 Linux网络编程常用API
2 粘包现象
四、再说说为啥不是两次握手或者四次握手?
五、最后聊一聊分析网络程序的工具
1 网络程序调试工具的思维导图
2 详解各个小工具
六 结尾

嘀嘀嘀。。。。一看广东,难道是腾讯的面试,哦原来是电话面试。那就开始吧!
一、这是一次有故事的对话
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

先说说三次握手的各个状态

二、三次握手的客户端服务端状态
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连发你受得了?相关推荐

  1. java实现四次挥手_java中三次握手四次挥手是什么?图文详解

    关于java中的一些基础的知识,是非常的多的,而且涉及的方面也是非常的广阔的.相信大家在日常的学习中也会遇到很多这些令人疑惑的问题,今天就来为大家介绍一下,一起来看看吧. 首先说一下,java中三次握 ...

  2. 我是如何在天猫、蚂蚁金服、百度等大厂面试中被拒的 | 掘金技术征文

    本人16年毕业于普通二本院校网络相关专业,工作经验两年半,目前就职业于一家普通民营企业. 由于非985.211学历硬伤,校招进大厂的门槛远高于同届985.211的毕业生.于是乎,从毕业到现在经历了三家 ...

  3. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)

    ⭐欢迎订阅<大厂面试突击>专栏,面试10多家大厂总结出的重点知识,仅前50名免费⭐ 在日落大道浪漫出逃 除了风没有人知道 前言 哈喽大家好,我是一条 最近3天面了大约有10家公司,平均一天 ...

  4. TCP/IP详解--TCP/IP中三次握手 四次握手状态分析

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  5. TCP协议中三次握手

    TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...

  6. 大厂面试中HR可能会问到的问题

    首要原则是要充分准备,也要如实回答,反复问自己,你的回答自己信吗?HR会信吗? 有些HR会进行压力面试,甚至是故意刁难,如果是虚拟回答有可能被揭穿.同时要学会随机应变,如果问到你没有准备到的问题也不要 ...

  7. 2021年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂

    一眨眼已经到2021年了,该反思一下,2020年都做了什么?有什么进步?年初的计划都实现了吗?金三银四有跳槽的底气了吗? 2020年我们经历了新冠疫情的洗礼,很多程序员都经历了失业,找工作的恐慌.导致 ...

  8. 大厂面试辛酸泪,阿里面了9次,字节捞了offer?Android开发狗25次

    到今年7月,我已经工作了整整3年!匆匆三年如白驹过隙,我还依然记得2017年的夏天. 在那个夏天,我脱下了属于大学时代的学位服,告别我的整个学生时代,我找到我的第一份正式的工作,也经历了我从校园融入社 ...

  9. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...

    PS:本文已收录到1.3 K+ Star 数的开源项目-<大厂面试指北>,如果想要了解更多,可以看一看,项目地址如下: https://github.com/NotFound9/inter ...

最新文章

  1. 9个常用iptables配置实例
  2. 框架:spring、springmvc、springboot
  3. HNOI2013 游走
  4. python msp_Python 练习实例71
  5. R语言观察日志(part2)--preProcess函数
  6. 使用 cf push 部署应用到 SAP BTP 时遇到错误消息 No domains exist for route
  7. 怎么安装redhat linux操作系统,红帽RedHat Linux5系统安装指南
  8. 上海大都会 H.A Simple Problem with Integers
  9. 【HDU - 2093】 考试排名(排序+格式输出)
  10. Linux学习笔记-调用pthead_create创建线程
  11. Linux 下挂载新硬盘方法(转)
  12. python-元组,列表,字典常用方法
  13. 产品经理 - 统一支付 、结算、清算
  14. 金融matlab创建3x3数组,Matlatb金融时间序列工具箱——建立金融时间序列
  15. php 读取脸型,基于OpenCV的PHP图像人脸检测识别技术
  16. Geoserver入门操作系列之二:创建图层样式
  17. 网站发布的文章如何快速被收录?
  18. 1 - 整洁代码 - 代码整洁之道
  19. 花生日记涉传销,给了互联网企业什么启示
  20. 2019年全国大学生电子设计大学(D 题)简易电路特性测试仪(2)基础部分电路与代码

热门文章

  1. java情剑天涯,征途的潇湘九夜改名叫什么了
  2. linux kernal pwn WCTF 2018 klist(一)
  3. 【VirtualAPP 双开系列07】第三方 APP Service、Provider 加载分析
  4. 2022-2023级北京大学光华管理学院MBA招生简章
  5. python怎么画飞天小海龟_跟着 “小海龟” 畅游画图世界
  6. 网络文化经营许可证全攻略!快收藏
  7. 怎样用电脑抠图换背景?抠图怎么把背景变透明?
  8. 关于CC2541蓝牙开发板的学习笔记-1
  9. 一个农民工混迹于 IT 行业多年后的泣血总结
  10. SDI接口图像预处理模块