网络编程系列第(一)篇---TCP/IP
1. TCP/IP是什么
TCP/IP,中文名网络通讯协议
TCP/IP是一个协议组,而不仅仅只是TCP协议+IP协议的组合
这个协议组可分为四层,分别是网络接口层,网络层,传输层,应用层。
顺便提一下,osi的参考模型将网络分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
两个参考模型的对应关系如下表
osi | tcp/ip |
---|---|
物理层,数据链路层 | 网络接口层 |
网络层 | 网络层 |
传输层 | 传输层 |
会话层,表示层,应用层 | 应用层 |
2. TCP/IP有何用
简单地讲,正是因为tcp/ip的存在,两个终端才能通过互联网进行远距离的数据交互。
那么数据想要从终端A传到终端B,需要哪些条件了?
- 待传输的数据
- 终端B的地址
- 一条连通的网络通道
既然条件已经具备了,那么就该tcp/ip发挥它的作用了,在这个传输过程中,tcp/ip的每一层都各司其职。
应用层
负责为应用程序提供访问网络服务的接口。
常见的协议包括以下几种
Telnet:远程登录协议
HTTP:超文本传输协议
FTP:文件传输协议
SMTP:简单邮件传输协议
DNS:域名服务协议
NFS:网络文件系统协议
传输层
负责建立和维护端到端的连接
常见的协议包括
TCP:传输控制协议
UDP:用户数据包协议
网络层
负责网络间的寻址和路由选择
常见的协议包括
IP:网际协议
ICMP:网际控制消息协议
ARP:地址解析协议
RARP:逆向地址解析协议
网络接口层
负责二进制数据流的实际传输
常见的协议包括
HDLC:高级链路控制协议
PPP:点对点协议
SLIP:串行线路接口协议
3. TCP/IP数据传输过程
先看一幅图
TCP/IP数据传输过程.png
这幅图可以分为两部分,左半部分和右半部分
左半部分是数据的发送过程,也是一个自上而下的过程。在应用层产生了一个“早上好”的数据后,将其交给传输层,这时TCP协议会增加一个TCP头部,此时数据变为“早上好+TCP头部”,并将其交给网络层,这时IP协议会加一个IP头部,此时数据变为“早上好+TCP头部+IP头部”,并将其交给数据链路层,此时以太网协议会增加一个以太网头部,此时数据变为“早上好+TCP头部+IP头部+以太网头部”,并将其交给物理层,物理层通过电缆线将数据传输出去
右半部分是数据的接收过程,它和发送过程完全相反,是一个自下而上的过程。在数据链路层解析数据中的“以太网头部”,如果是发给自己的包,则将以太网头部的其余部分上送给网络层,在网络层解析数据中的“IP头部”,如果是自己的数据,则将IP头部以外的数据上送给传输层,在传输层解析数据中的“TCP头部”,如果是自己的数据,则将TCP头部以外的数据,上送给应用层,而此时接收到数据恰好就是发送的数据“早上好”,至此,这个传输过程结束了。
当然,我也只是简单地描述了一下数据的传输过程,实际上的传输过程肯定要负复杂的多,比如网络层的寻址和路由选择就涉及到了很多细节,这就需要大家去看更专业的书籍了。
4. 部分协议解析
4.1 IP协议
先看一幅图
IP数据包.jpeg下面详细分析下各部分的作用
-
版本。占4位,指IP协议的版本。目前广泛使用的是ipv4
-
首部长度。占4位,可以表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32字长(一个32位字长是4字节),因此,当IP首部长度为1111时(即十进制的15),首部长度就达到15乘以4=60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。最常用的首部长度是20字节(即是首部长度为0101),这样不使用任何选项。
-
总长度。占16位。总长度指首部和数据之和的长度,单位为字节。数据报的最大长度为2^16-1=65535字节。
-
标识。占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个标识不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同标识字段的值使分片后的各数据报片最后能正确重装为原来的数据报。
-
标志。占3位。目前只有两位有意义。
标识字段中的最低标记为MF(More Fragment)。MF=1表示后面还有要分片的数据报。MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF(Don't Fragment),意思是不能分片。只有当DF=0时才允许分片 -
片位移。占13位。片位移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片位移以8个字节为偏移单位。即,每个分片的长度一定是8字节(64位)的整数倍。
-
生存时间。占8位。即TTL值
-
协议。占8位。指出数据报携带的数据是使用何种协议。
-
首部校验和。占16位。只校验数据报的首部,不包括数据部分。这是因为数据报没经过一个路由器,路由器都要重新计算一个首部校验和(一些字段,如生存时间,标志,片位移等都可能发送变化)。不检验数据部分可减少工作量。
-
源地址。占32位,发送端的IP地址。
-
目的地址。占32位,接收端的IP地址。
4.2 TCP协议
先看两幅图
TCP数据包.jpeg TCP三次握手,四次挥手.jpg4.3 UDP协议
先看一幅图
UDP数据包.jpeg4.4 TCP/UDP对比
TCP | UDP |
---|---|
面向有链接的通信服务 | 面向无连接的通信服务 |
提供可靠的通信传输 | 不可靠,会丢包 |
保证数据顺序 | 不保证 |
数据无边界 | 数据有边界 |
速度快 | 速度慢 |
面向字节流 | 面向报文 |
一对一 | 可以一对一,一对多 |
报头至少20字节 | 报头8字节 |
有流量控制,拥塞控制 | 没有 |
虽然TCP传输速度快(网络完美的状态),但由于各种机制,实际上的传输速度比UDP慢
-
为什么UDP比TCP快
TCP需要三次握手
TCP有拥塞控制,控制流量等机制 -
为什么TCP比UDP可靠
TCP是面向有连接的,建立连接之后才发送数据;而UDP则不管对方存不存在都会发送数据。
TCP有确认机制,接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。 -
TCP无边界,UDP有边界
- TCP无边界
客户端分多次发送数据给服务器,若服务器的缓冲区够大,那么服务器端会在客户端发送完之后一次性接收过来,所以是无边界的; - UDP有边界
客户端每发送一次,服务器端就会接收一次,也就是说发送多少次就会接收多少次,因此是有边界的。
- 什么时候用TCP,什么时候用UDP
TCP:文件传输,发送邮件等对数据可靠性要求较高。
UDP:语音,视频等对数据可靠性要求较低,但对效率要求较高的。