标签:学习笔记。
文章目录
1.TCP/IP四层协议网络结构
虽然之前有很多网络体系结构,但是这个是现在用的最多
- 1应用层:应用层的作用是应用进程间的交互来完成一定功能。它定义的是应用进程间的通信规则。如SMTP协议
- 2运输层:为应用提供通用的数据传输服务。它可同时对多个进程提供服务,可以理解成Android中的服务。
该层主要用的两种协议:
(1)TCP:(transmission Control Protocol),它提供可靠的传输服务,像银行网络肯定使用的是TCP(不可靠钱就没了)
(2)UDP:(user datagram Protocol),它提供尽最大努力传输数据的服务。像我们传输视频时一般使用UDP传输。 - 3.网络层:它的作用就是把数据发送不同主机上的进程。在该层用的协议叫IP(internet protocol),和一些路由协议,像路由器到网络层就够了。
- 4.网络接口层:这里其实包含了数据链路层和物理层。可以这样理解数据链路层,A->B->C,A想传输数据到C,中间需要经过路由器B,但是A和C连接B的网络状态有可能不同,就需要加上一些同步信息、差错控制。以确保IP数据包正确的传输。还有物理层的理解,可以理解成传输比特流的硬件吧。
此外还有一个种漏斗状的网络结构。最顶层的是应用层的协议,像后面应用的实时流协议,都应用此层。
2.UDP协议简介
2.1 UDP首部介绍
官方的文档为:https://tools.ietf.org/html/rfc768
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
|
| data octets ...
+---------------- ...
User Datagram Header Format
上面图引用自官方文档,能够看到UDP首部由8个字节组成。
- source port:源端口发送请求的应用进程所拥有的端口
- destination prot:目的应用进程所拥有的端口
- length:UDP数据报的长度,这里要特别注意,长度包含了首部的8个字节。
- checksum:UDP数据报的校验和,有错误直接丢弃。详细介绍可以查阅官方权威文档
科普:(端口)
一开始我的理解是一个进程对应一个端口
,后来百度了一圈发现一个进程可以拥有多个端口
,端口只和socket对象一一对应
。后一篇博文,编程验证到底一个进程能不能拥有多个端口。
上面右侧可以直观的发现,顶层协议的数据头和数据部分,属于下层协议的数据部分。
2.2 UDP特点
- UDP在发送数据之前不需要建立连接的,直接把数据都给对方。
- UDP不保证数据的可靠,尽最大努力传输数据
- UDP没有阻塞控制,平时在微信视频通话时,突然网络卡顿了,画面延迟,待网络恢复后,画面被快速播放(尽快将服务器上阻塞帧播放完毕)
- UDP支持一对一,一对多,多对一,多对多的通信。
https://www.jianshu.com/p/3aea1d52e77f
2.3 UDP例程
例程可以从 下载到。
- 数据包确认
本次client<—>server共通信6次,一来一回总共有12次,下面可以看到确实有12个数据报。client端运行后首先会向server发送要给“hello world消息”,这个可以从实例程序中了解到。
- 流的追踪
可以看到通过wireshark追踪的流和输入的是一样的。
- 协议分析
当前分析的这个数据包为client->server,所以根据下方解析出来的,可以确定server对应的端口为8888
,而clent进程的端口为6666
。此外由于例子中client端的发送缓冲设置为1024字节,所以下面看到数据长度为1024,加上UDP header为1032字节。
2.4 UDP编程流程图
- 流程图
图片引用自:https://blog.youkuaiyun.com/haiersister/article/details/22167967
- vs2010 UDP工程下载
源码可以参考:http://www.cnblogs.com/lyggqm/p/6558002.html
VS2010工程client和server可以从 这里 下载到。
刚一开始编译时遇到下面这样的错误。
d:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(24): fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
解决方法:
如上图将MFC的使用设置为“在共享 DLL 中使用 MFC”。问题接口解决。
3.TCP协议简介
官方权威文档:https://tools.ietf.org/html/rfc793#page-15
3.1 TCP首部
下图截取自官网其中每一个横线代表一个bit。
3.2 TCP特点
- 面向连接的运输层协议,在变成一开始时,客户端需与服务器建立连接,才能通信。
- TCP连接只能有2个端点,只能一对一通信。建立连接后就可以拿到一个套接字(IP地址:端口),套接字只能被通信两端所确定。
- TCP提供可靠的交付服务
- TCP时全双工的,任意时间客户端和服务的都可以同时发送数据。两边都有缓冲
3.3 TCP例程
实例代码可以在这里下载:https://download.youkuaiyun.com/download/armwind/10991891
- 实例程序输入效果:
- 通信整个过程
server运行开始前,本地已经开始抓包了,下面可以看到开始的三次握手过程(抓的包会提供在示例程序中)。
- 整个对话过程数据交互结果
可以发现与一开始输入是对应的。
- TCP报文段分析
下面是三次握手后,client发送给server的第一句话。结合TCP协议格式对照理解头部字段。
3.4 TCP编程流程
- 流程图
图片引用自:https://blog.youkuaiyun.com/haiersister/article/details/22167967 这个图很完整。对着源码例程也是按着这个逻辑来的。
- vs2010 TCP工程下载
源码可以参考:http://www.cnblogs.com/lyggqm/p/6558002.html
VS2010工程client和server可以从 这里 下载到。
4.IP协议简介
4.1 IP首部介绍
首部官方文档:https://tools.ietf.org/html/rfc791
- version:ip协议的版本(4bit)
- IHL:(Internet Header Length)首部长度。(4bit)
- service type: 一般情况下不适用这个字段,直有在使用区分服务时,才有用(4bit)
- totol length:首部和数据总长度
- identification:计数器,每产生一个数据包计数器就加1,(16bit)
- flags:(3bit)用来标记是不是后续还有数据,当mf=0,表示当前时最后一个数据报了。df:表示不能分片,就是数据不能截断。直有当df=0时才允许分片。
Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
0 1 2
+---+---+---+
| | D | M |
| 0 | F | F |
+---+---+---+
- fragment offset:片内偏移,也就是说相对于用户数据字段七点,该片从何开始。(13bit)
- time to live:(TTL)数据报在网络上的寿命,也可以称为跳数。跳数就是在路由器之间最多转发的次数,每转发一次TTL就减1(8bit).
- protocol:协议类型(8bit):
- header checksum:之检验数据报的首部,不包含数据部分。(16bit)
- source address:源地址(32bit)
- destination address:目的地址(32bit)
4.2 实例分析
对照上面的头部格式,分析下面数据包