秋招面试也不记得多少家公司会有这个面试题。所以将其总结一下并分享给大家。

@
嘀嘀嘀。。。。一看广东,难道是腾讯的面试,哦原来是电话面试。那就开始吧!

一、这是一次有故事的对话





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

二、三次握手的客户端服务端状态

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. 第1次握手:建立连接时,客户端发送 SYN 包到服务器端,携带一个序列码给服务器端用于确认,并进入 SYN_SEND 状态,等待服务器端确认。(发起连接状态)

  2. 第2次握手:服务器端收到 SYN 包,首先确认客户的SYN,并对序列码加1处理,发送一个自己的SYN包,携带一个自己的序列码,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。(连接接收状态)

  3. 第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. TCP协议中三次握手

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

  2. TCP中三次握手建立和四次握手释放以及相关问题

    本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...

  3. 【大厂面试07期】说一说你对synchronized锁的理解?

    synchronized锁的原理也是大厂面试中经常会涉及的问题,本文主要通过对以下问题进行分析讲解,来帮助大家理解synchronized锁的原理. 1.synchronized锁是什么?锁的对象是什 ...

  4. TCP/UDP协议、理解三次握手四次挥手、Socket

    一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要 ...

  5. Java网络编程学习A轮_02_抓包分析TCP三次握手过程

    参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...

  6. 让你彻底明白TCP三次握手,四次挥手

    今天我们来讲一下TCP的三次握手和四次挥手,先来张思维导图.  一.TCP是什么 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流 ...

  7. 【大厂面试08期】谈一谈你对HashMap的理解?

    摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...

  8. TCP 中的三次握手和四次挥手

    Table of Contents 前言 数据报头部 三次握手 SYN 攻击 四次挥手 半连接 TIME_WAIT 结语 参考链接 前言 TCP 中的三次握手和四次挥手应该是非常著名的两个问题了,一方 ...

  9. <转载>面试官,不要再问我三次握手和四次挥手

    版权声明:本文为CSDN博主「夏雪冬日」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/hyg0811/a ...

随机推荐

  1. springboot 配置文件中属性变量引用方式@@解析

    这种属性应用方式是field_name=@field_value@. 两个@符号是springboot为替代${}属性占位符产生,原因是${}会被maven处理,所以应该是起不到引用变量的作用. @@ ...

  2. 超容易理解的call()、apply()、bind()的区别

    call().apply().bind()是用来改变this的指向的. 一 举个例子 一个叫喵喵的猫喜欢吃鱼,一个叫汪汪的小狗喜欢啃骨头,用代码实现如下: 有一天,小狗汪汪和喵喵共进午餐的时候,汪汪说 ...

  3. 【23.68%】【hdu 2871】Memory Control

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  4. 2018-11-1-Windows-Community-Toolkit-3.0-新功能

    title author date CreateTime categories Windows Community Toolkit 3.0 新功能 lindexi 2018-11-1 9:2:55 + ...

  5. dotnet 通过 WMI 获取系统安装的驱动

    本文告诉大家如何通过 WMI 获取用户已经安装的驱动程序 通过 Win32_SystemDriver 可以获取用户已经安装的驱动程序 var mc = "Win32_SystemDriver ...

  6. HDU - 5015 233 Matrix (矩阵快速幂)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  7. IdentityServer4 Resources

    原文地址 Resources 的定义 通常在系统中是顶一个需要保护的资源.这些资源可是用户的信息,比如身份信息或者邮箱地址,也可以是某些API的访问权限. Note: 可以通过C#的对象模型或者通过数 ...

  8. 读<大道至简>--软件工程实践者的思想有感

    初闻其名,<大道至简>,大多人都会觉得这是一本满腹人生哲理的书籍,作者洋洋洒洒的谈论大道理,其实不然,作者以古典文化为引,以作者的所思所想为线,启蒙了我作为一个软件工程初学者的实践思想. ...

  9. URL统一资源定位符

    URI 是统一资源标识符 URL 是统一资源定位符 ===================================================== 参考链接: 前端学HTTP之URL:ht ...

  10. Avram Joel Spolsky给计算机系学生的建议

    Avram Joel Spolsky给计算机系的学生给了如下建议:     (1)毕业前练好写作     (2)毕业前学好C语言     (3)毕业前学好微观经济学     (4)不要因为枯燥就不选修 ...