计算机网络再次整理————tcp例子第二前奏[四]
前言
前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept、bind、listen、connect、send做了什么。
可以说是从宏观的角度,或者代码开发的角度来说的,在此我觉得还不够具体。
同样我想解释一下为什么我说服务端listen之后,客户端已经可以进行tcp连接了,同样可以发送消息了。
正文
首先我们的tcp连接网图:
前提,这个时候服务端只是listen了,并没有accept。且客户端调用了connect,同时send 了hello word了。
第一个包:
客户端发起tcp连接。
上面可以看到seq 为0,同样有0x002 SYN 标志。
第二个包:
这是服务器端给客户端的.
说明此时服务端是认可了客户端的请求的,并且呢,开始进行了确认操作。
第三个包:
这是客户端发出的,3次握手已经完成了,说明已经连接上了。
然后就是要确认之后listen 之后是否可以发送消息。
第四个包:
客户端已经向服务端发起了消息。
可以看到数据是:68656c6c6f2073657276696365
大家可以用utf8 16进制进行解码看下解密出来的是啥。
第五个包:
服务端的确认包。说明服务端确认收到了数据的。
其实这些连接和收包前文提及了,其实都是操作系统帮助我们做了。
那么为什么有些书本要写,accept 之后才是连接呢?
这是因为相当我们的应用程序而言的,accept之后,我们才能知道客户端连接过来的在服务端创建的socket是多少。
这个时候服务端才知道有客户端进行了连接了,所以认为这个时候才连接成功了。而一些书本认为服务端也不包含操作系统,仅是我们的应用程序。
这里我用的是wireshark 进行抓包的。
本来想把四次挥手也截屏出来的,但是后面向介绍一些更具体的东西,所以往后推一推吧,这样也不会冗余,同时大家交流起来更加的自然。
实验代码如下:
服务端:
using System.Net;
using System.Net.Sockets;
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ipAddress = IPAddress.Parse("127.0.0.1");
EndPoint endPoint = new IPEndPoint(ipAddress, 8888);
socket.Bind(endPoint);
socket.Listen();
Console.ReadLine();
客户端:
using System.Net;
using System.Net.Sockets;
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ipAddress = IPAddress.Parse("127.0.0.1");
EndPoint endPoint = new IPEndPoint(ipAddress, 8888);
socket.Connect(endPoint);
socket.Send(System.Text.Encoding.UTF8.GetBytes("hello service"));
Console.WriteLine("发送成功");
Console.ReadLine();
结
以上只是个人的整理,如有错误,望请指点。
最新文章
- mysql 查看 删除 日志操作总结(包括单独和主从mysql)
- ajax中文传送到模板显示为null
- javaweb2 URL(查找的过程)
- switch… case 语句的用法(二)
- [ActionScript 3.0] AS3动态改变注册点
- 【原创】Hadoop机架感知对性能调优的理解
- url、base64 编码规则
- SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;
- Content-Disposition的使用方法
- linux虚拟机centos64位_6.5+VM10安装oracle11g图文详解
- 以xml的方式实现动画
- Docker 网络命令
- HDU1016(素数环)
- Mysql 忘记管理员密码更改
- docker-compose up使用自定义的网段的两种方式(从其根源指定)
- Gson解析空字符串异常的处理
- java得到当前日期的前一天或后一天
- Android程序的反破解技术
- Java之24种设计模式-UML-模型图解读
- 记录:测试本机下使用 GPU 训练时不会导致内存溢出的最大参数数目