计算机网络拓跋结构,实战 | 服务端开发与计算机网络结合的完美案例

前言

大家好,我是阿秀

后端,可以说是仅次于算法岗之外竞争最为激烈的岗位,而其中的服务端开发也是很多人会选择在秋招中投递的一个岗位,我想对于很多人来说,走上服务端开发之路的起点就是一个回声服务器了。

今天带大家实战一把,真实体验服务端底层数据交换的点点滴滴,在这过程中可以让你看见 TCP 三次握手四次挥手的具体过程,全程干货,不开玩笑。

5da25a1b498224691976fcb74b469aaa.png

环境工具

客户端:Ubuntu 16.04 ,IP:192.168.78.128 ,简称为客户端A

服务端:Ubuntu 16.04 ,IP:192.168.78.130,简称为服务端B

抓包利器-大白鲨  Wireshark  以及 Linux 下的抓包命令 tcpdump

GCC:5.4.0

因为 Wireshark 的图标就很像一条大鲨鱼的鱼鳍,所以又叫大白鲨,不信你看看

69e2b9b4ec83dc10859f11063e948f14.png大白鲨

三次握手与四次挥手

这里简单介绍下 TCP 最经典的三次握手与四次挥手

8f03be086e069f4054298ac6305264f4.png三次握手四次挥手

三次握手

第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 位置为1,seq(Sequence Number) 为 x;然后,客户端进入 SYN_SEND 状态,等待服务端的确认;

第二次握手:服务端收到 SYN 报文段。服务端收到客户端的 SYN 报文段,需要对这个SYN 报文段进行确认,设置 ack(Acknowledgment Number) 为 x+1 (也就是 seq+1);同时,自己还要发送 SYN 请求信息,将 SYN 位置为1,seq 为 y;服务端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端,此时服务端进入 SYN_RECV 的状态;

第三次握手:客户端收到服务端的 SYN+ACK 报文段。然后将ack设置为y+1,向服务端发送ACK报文段,这个报文段发送完毕以后,客户端和服务端端都进入 ESTABLISHED 状态,完成TCP三次握手。

数据交互

成功建立连接后,客户端与服务端就开始进行数据交互。客户端发送数据,服务端回复收到该数据,然后交替进行下去。

四次挥手

当客户端和服务端通过三次握手建立 TCP 连接进行可靠数据传输后,当数据传送完毕,肯定是要断开TCP连接,这里就有了神秘的“四次挥手”。

第一次挥手:客户端设置 seq和ack,向服务端发送一个FIN报文段;此时,客户端进入 FIN_WAIT_1 状态;这表示客户端没有数据要发送给服务端了;

第二次挥手:服务端收到了客户端发送的FIN报文段,向客户端回一个 ACK 报文段,ack 为 seq+1;客户端进入 FIN_WAIT_2 状态;服务端告诉客户端,我“同意”你的关闭请求;

第三次挥手:服务端向客户端发送 FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态;

第四次挥手:客户端收到服务端发送的 FIN 报文段,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT状态;服务端收到客户端的 ACK 报文段以后,就关闭连接;此时,客户端等待 2MSL 后依然没有收到回复,则证明服务端已正常关闭,那好,客户端也可以关闭连接了。

思路整理

这里主要使用的是尹圣雨[韩]的著作《TCP/IP网络编程》第 4 章中的简易版回声服务器来进行实验。

所谓回声服务端,就像小时候在回声山谷中玩的游戏一样,你朝山谷中大吼一声“啊”,然后山谷也会给你一个“啊”。回声服务端就是你向服务端发送一个“hello world”,回声服务端也向你回复一个“hello world”。

1、将客户端程序 echo_client.c 放在客户端 A 中,将服务端程序 echo_server.c 放在服务端 B 中

2、在客户端 A 中开启一个命令行窗口,使用 tcpdump 命令监控 A、B 之间的网络通信,并将消息保存为 pacp 文件,方便后续进行抓包分析

3、在服务端 B 中编译程序 echo_server.c,开启服务端程序 echo_server,监听指定端口 2333

这里的端口号可以自己指定,在 1025-65535 之间都可以,主要是因为0-1024已经被系统占用了,比如http的80端口,ssh的22端口。而 Linux 下默认端口数在65535个,所以自己可以指定的端口号就在1025-65535之间。

4、在客户端 A 中编译程序 echo_client.c,并且开启客户端程序 echo_client,指定通话 IP 以及端口号,我在这里就是服务端 B 的IP:192.168.78.130以及 2333 端口号了

5、在客户端 A 中发送消息“hello”,然后按 Q 退出即可

6、通信完毕,将 2 中保存的文件转存到 Windows 环境下,使用大白鲨 Wireshark 进行网络数据包分析。

7、分析抓到的数据包文件

开干

说了那么多,终于可以开始开干了!

1、将echo_client.c 、echo_server.c分别放在客户端A:192.168.78.128 以及服务端B:192.168.78.130 中。

2330e8ae8ca8098f846a9619fd6d2379.png客户端A

c318d5454205d6ba31a194ce2ce3804c.png服务端B

2、  在客户端A中新开一个命令行窗口,输入命令:sudo tcpdump -i any tcp and host 192.168.78.130 and port 2333 -w message.pcap

1、由于tcpdump命令需要管理员权限,所以需要加上sudo命令进而获取管理员权限。

2、这段命令的大概含义就是监控客户端 A:192.168.78.128,和服务端 B:192.168.78.130 之间在端口号2333 上的基于TCP的数据交换,并且保存为 message.pcap 文件

1cee5467dd17287584502ee0f42f2a3b.pngtcpd数据包保存命令

可以看到,我们在输入该条命令后,需要首先输入 Linux 下的密码获取管理员权限,然后就开始监听客户端 A:192.168.78.128,与服务端 B:192.168.78.130之间在端口号2333上的TCP通信了。

3、接下来,我们进入含有 echo_server.c的文件夹,将服务端B的程序进行编译,编译命令为 gcc echo_server.c -o echo_server,可以看到当前文件夹下出现了 echo_server 程序

30d1fe547dbcaf8983af530608b20700.png编译服务器程序

接下来,开始监听我们预先设置好的端口号 2333,命令为:./echo_server 2333,服务端开始正式监听。

17df664ecef9d4935b08ba1288fa0a7b.png运行服务器程序

4、服务端 B 设置完毕,我们开始转战客户端 A ,在 2 中使用 tcpdump 命令监听的那个端口号不要关闭,千万不要关闭,我们在客户端 A 中另外新开一个命令行。

跟服务端 B 中类似,首先将客户端 A 中的程序echo_client.c进行编译,编译命令:gcc echo_client.c -o echo_client

f17571529eca686cdbc6c5aba26373fd.png编译客户端程序

跟服务端 B 中类似,我们在客户端 A 中开启客户端程序echo_client,指定通话IP :192.168.78.130及端口号 2333

命令为./echo_client 192.168.78.130 2333

90168c5a36ff71bddf4f89281c6eb2c0.png运行客户端程序

可以看到出现 “Connected…..”字样,说明我们已经走完长征两万五千公里,成功会师啦!

客户端 A 与服务端 B 终于成功连接了,这个时候我们再转去看一下服务端 B 的状态。

88baf439f01af44b011ff8d23f94b34b.png服务器程序状态

在服务端 B 的监听窗口也出现了“Connect client 1”字样,换句话说,在服务端看来,有一个客户端与它成功建立连接了。

5、下一步就可以开始通信了,我们在客户端 A 中发送“hello”字样。

09e7c0c5efabc314dad46a14b76192a6.png在客户端A发送消息

可以看到,我们在客户端 A 中发送了一条消息“hello”, 服务端 B 也给了我们一个消息“hello”,这也就是我们上文中提到的回声服务端了。

接下来,我们按照提示,输入“Q”结束本次通话。

5b1e2f7c762bef068e3d35d482eec50f.png退出客户端A

至此,本次通话结束。

6、最后我们在 2 中开启 tcpdump 命令监控的界面中,按下 ctrl+ c ,结束监听。

320e224f47caa8046bf324b2da93a115.png保存抓包文件

可以看到,提示我们一共成功捕获了10 个packets,没有数据包丢失。接下来,我们将捕获文件 message.pacp传输到 Windows 下开始进行抓包分析。

19fa7adc08ffb58a6428b9c945ec73db.png

抓包分析

可以看出一共 10 个数据包,也对应了上文中我们在 Linux 下通过tcpdump命令抓到的数据包个数。其中序号 1-3 为三次握手的数据包,序号 4-7 为两次数据交换的数据包,8-10 为三次挥手的数据包。

73477b4de56f8e83564d649095cd06b9.png抓到的10个数据包问题1:4-7 为什么是两次数据交换呢?

回答1:我们的回声服务端就是你发送什么数据过去,服务端发送什么数据回来,所以第一次数据交换:客户端A发送数据”hello“到服务端B,B回复 确认收到。这也对应着4、5数据包;第二次数据交换:服务端B发送数据”hello“到客户端A,A回复 确认收到。这也对应着6、7数据包。

问题2:说好的四次挥手呢?这里怎么只有三次了?

回答2: 因为服务端收到客户端的 FIN 后,服务端也可以同时关闭连接,这样就可以把 ACK 和 FIN 两个包合并到一起发送,这样可以节省一个网络包,“四次挥手”变成了“三次挥手”。这样可以节省网络资源,省时又省力。而通常情况下,服务端收到客户端的 FIN 后,很可能还没发送完数据,所以就会先回复客户端一个ACK 包,完成所有数据包的发送后,才会发送 FIN 包,也就是“四次挥手“了。

039064e9fe0add6414fb499abbc0ee6d.png

三次握手过程

2d72c05a4aadfed801fc98b7520608e9.png三次挥手过程

第一次握手,序号为1,客户端A:192.168.78.128 向服务端B:192.168.78.130 发送SYN请求包,seq为1796975076。

第二次握手,序号为2,服务端 B:192.168.78.130 向客户端A:192.168.78.128 发送 SYN、ACK 请求回复包,seq为1222412335,ack为1796975077,也就是第一次握手中的 seq+1。

第三次握手,序号为3,客户端A:192.168.78.128 向服务端B:192.168.78.130 发送 ACK 确认包,seq为1796975077,ack为为1222412336,也就是第二次握手中的 seq+1。

两次数据交互过程

第一次数据交互:

2dd2c6693ac3d5542d24944d3546896c.png第一次数据交互

序号为4,客户端A:192.168.78.128 向服务端B:192.168.78.130 发送 push 消息包,可以看到下方的数据解析为“hello”,并且数据长度 len = 6。

可能有些小伙伴问“hello不是一共5个字符吗?长度应该为5啊。”len = 6是因为“hello“长度为5,再加上结尾的‘\0’,加起来一共就是6了

序号为5,服务端B:192.168.78.130 向客户端A:192.168.78.128 发送 ACK 确认包,表示已经收到该消息。

第二次数据交互:

a5717bc3331ce8a1670161d117b36411.png第二次数据交互

序号为6,服务端B:192.168.78.130 客户端A:192.168.78.128发送push消息包,可以看到下方的数据解析为“hello”,并且 len = 6。

序号为7,客户端A:192.168.78.128 向服务端B:192.168.78.130  发送ACK确认包,表示已经收到该消息。

三次挥手过程

正式的四次挥手如下图所示:

11f2c456bf97ecb3d8f74b12cd3c6a11.png标准的四次挥手

我们所抓到的三次挥手如下所示:

6deb29e18a24da4c1e2f71114b63a068.png我们抓包抓到的三次挥手

第一次挥手,序号为8:客户端A:192.168.78.128 向服务端B:192.168.78.130  发送 FIN 请求断开连接包,表示主动请求断开链接。

第二三次挥手,序号为9:服务端B:192.168.78.130 向  客户端A:192.168.78.128发送 FIN、ACK 确认并请求断开消息包,表示收到上次断开连接的请求,并请求断开服务端到客户端的链接。

可以看出,我们所抓的包中,将第二次挥手和第三次挥手合并为一个数据包了,也就是192.168.78.130->192.168.78.128的包中既有FIN也有ACK,所以这也是三次挥手而不是四次挥手的原因。

第四次挥手,序号为 10:客户端A:192.168.78.128 向服务端B:192.168.78.130  发送 ACK 确认包,表示收到服务端发送过来的请求断开连接消息,并给予回复。

结语

学会将自己所学的知识串联起来是你迈向大佬的必经之路

3da2e4d0173900670101c5c4de549978.png

巨人的肩膀

《TCP/IP网络编程》- 尹圣雨[韩]

《Wireshark网络分析就这么简单》- 林沛满

《Wireshark网络分析的艺术》- 林沛满

《计算机网络-自顶向下方法》- ames F. Kurose、Keith W. Ross

《TCP/IP详解 卷1:协议》- kevin R.Fall W.Richard Stevens

—END—

“你只管努力,剩下的交给时间就好,我就是活生生的例子~”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pcu tps_Mac版Microsoft Office 2011重新定义您的TPS报告体验

pcu tpsOffice 2011 for Mac is going to be released in a couple of days, and we got our hands on the latest version already. Here’s a quick tour of some of the new features in the latest version of Office. Mac版Office 2011将在几天内发布,我们已经…

【转载】intellij idea如何将web项目打成war包

1、点击【File】->【Project Structure】菜单(或使用ShiftCtrlAltS快捷键),打开【Project Structure】窗口。如下图: 2、在【ProjectStructure】中选择左侧的【Artifacts】页签。如下图: 3、点击中间上面的&#xf…

形容计算机老师风采的句子,关于老师的句子

Tips:点击图片进入下一页或下一篇图有一种光荣的职业,叫老师;有一种难忘的情结,是老师;有一种最美的祝愿,送老师。以下是关于老师的句子,希望大家能喜欢。1、一只粉笔两袖清风,三尺讲台四季耕耘&#xff0c…

蓝牙 唤醒计算机_如何防止计算机意外唤醒

蓝牙 唤醒计算机Putting your PC to sleep is a great way to save energy while still making sure you can resume work quickly. But what can you do if your PC keeps waking up on its own? Here’s how to figure out what’s waking it up, and how to prevent it. 使…

ppt 计算机图标不见了,我PPT的图标变成这样了,为什么

公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解。话题:我PPT的图标变成这样了,为什么?怎么变回去?回答:软件坏了或者被误删不支持PPT格式了,重装一下就能支持了话题&#…

如何使Flash在Internet Explorer的64位版本中工作

You’re using the 64-bit version of IE 9 Beta and attempt to watch flash videos, and realize they won’t play. Here we look at fixing the problem by installing the new 64-bit version of Adobe Flash. 您正在使用IE 9 Beta的64位版本,并尝试观看Flash视…

笔记本计算机没反应怎么办,有办法 | 耳机插进电脑没反应怎么办?

原标题:有办法 | 耳机插进电脑没反应怎么办?大家好,我是你们人见人爱,花见花开的信小工同学。今天,我要化身电脑维修师,为同学们解决电脑中那些让人“捉急”的小问题。童鞋:小工!小工…

clonezilla使用_如何使用Clonezilla备份和恢复已死或即将死去的系统磁盘

clonezilla使用March 31st, 2011 is “World Backup Day”—celebrate it by using free software Clonezilla to clone an exact copy of your OS system disk, regardless if you use Windows, Mac OS, or Linux! 2011年3月31日是“世界备份日”,无论您使用Window…

vue之安装配置

直接上图 转载于:https://www.cnblogs.com/wdxue/p/8079349.html

浏览器显示无法解析服务器的DNS地址,使用搜狗浏览器时突然弹出无法解析服务器的DNS地址该如何处理...

导语:小编也是搜狗浏览器的忠实粉丝,但是最近在使用浏览器的时候频频出现“无法解析服务器的DNS地址”的情况。为了修复这个故障小编也耗费了很多的时间,最后发现只要更改一个DNS就能够轻松的解决这个问题,下面白豆芽就和大家分享…

基于Mint UI和MUI开发VUE项目一之环境搭建和首页的实现

一:简介 Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要。通过它,可以快速构建出风格统一的页面,提升开发效率。真正意义上的按需加载组件。可以只加载声明过的组件及其样式文件,无需再纠结文件体积…

linux正则表达式替换_在Linux上使用Regexxer简化正则表达式搜索/替换

linux正则表达式替换If you are tired of hacking together commands at the terminal or having to open a giant bloated IDE just to perform search and replace across a number of files, then Regexxer is the tool for you. 如果您厌倦了在终端上一起打包命令&#xff…

Java设计模式之策略设计模式

1.什么是-策略设计模式 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如…

电脑卡死,电脑卡屏死机几个原因与解决办法必看

电脑卡屏死机几个原因与解决办法必看相信很多朋友都遇到了关于电脑卡屏死机的问题,那么该电脑卡屏死机是什么原因呢?该如何解决?那么下面给你们说说电脑卡屏死机的原因和解决方法吧,希望可以帮到你们哦!电脑卡屏死机几个原因:1 电脑中毒或中恶意软件&am…

eclipse上搭建mybatis

1..在help中打开 2.搜索mybatipse 3:功能简介 1:要查找某一个方法 在dao接口中某一个方法中 按住 Ctrl键 鼠标指到方法名称上 选择open xml 就会自动跳转 2:自动生成resultMap 安装键盘 alt / 会弹出提示框 3:引用re…

outlook工具栏显示_Outlook 2007中的待办事项栏仅显示当前任务

outlook工具栏显示One of the best new features in Outlook 2007 is the To-Do bar, where you have quick access to your calendar as well as your task list. Unfortunately, the default setting of showing all of your tasks regardless of date can be overwhelming f…

在数据采集器中用TensorFlow进行实时机器学习

最新DataOps平台的真正价值,只有在业务用户和应用程序能够从各种数据源来访问原始数据和聚合数据,并且及时地产生数据驱动的认识时,才能够实现。利用机器学习(Machine Learning),分析师和数据科学家可以利用…

excel条件格式使用_如何使用条件格式在Excel中创建进度栏

excel条件格式使用Progress bars are pretty much ubiquitous these days; we’ve even seen them on some water coolers. A progress bar provides instant feedback on a given process, so why not bring some of that graphical pizzazz into your spreadsheet, using Exc…

raspberry pi_每日新闻摘要:新型iMac,NVIDIA的Raspberry Pi竞争对手等

raspberry piFor the morning of March 19th, 2019, Apple unveiled an updated iMac, NVIDIA showed off a Raspberry Pi competitor, Instagram will let you buy things without leaving the service, Call of Duty is coming to mobile, and a lot more. 在2019年3月19日上…

鼠标指针放置上面,显示内容_使鼠标指针远离您键入的内容

鼠标指针放置上面,显示内容If your mouse pointer seems to constantly get in the way while you are typing, you aren’t alone… you click in the middle of some text and start typing to insert more, but the cursor stays in the way. There’s a tiny utility calle…