TCP/IP-入门
Life is not a rehearsal
"人生没有彩排"
参考资料:TCP/IP入门经典 (第五版)
一、什么是TCP/IP
TCP/IP是一族定义了网络数据传输规则的协议,现在大多数的网络设备都使用TCP/IP协议进行通信
二、TCP/IP分层
1、分层
应用层 | |
传输层 | |
网络层 | |
数据链路层 |
2、各层的主要功能
● 数据链路层:处理通信电缆与接口的细节,将网络层传来的IP数据报转化为帧,再转化为比特流,使其能在通信介质之间传输
● 网络层:提供逻辑寻址的功能,使数据传输独立于硬件地址
● 传输层:为两台主机上的应用程序提供端到端的通信,提供了流量控制、错误控制和确认服务
● 应用层:处理特定的应用程序细节
3、各层上的常见协议及简介
各层上的协议
(自己把书上的图重新画了一遍...)
协议简介:
● TCP:提供可靠的传输层服务,面向连接
● UDP:为应用程序发送和接收数据报,无连接,不可靠
● IP:网络层的核心协议,提供逻辑寻址、路由选择等服务
● ICMP:IP协议的附属协议,用来与其他主机或路由器交换错误报文和其他重要信息
● IGMP:Internet组管理协议,用来把UDP数据报多播到多个主机
● ARP和RARP:用于将IP地址和硬件地址相互转换
三、一些重要的概念
1、IP地址:IP地址是网络层抽象出来用一个32bit(IPv4)整数来表示的逻辑地址,用于唯一地标识网络上的每一台设备,常用的表示方法是点分十进制,如:192.168.1.1
IP地址分类:
各类IP地址的范围:
2、物理地址(MAC地址):网络设备的身份标识,出厂时就已经固化在网络硬件当中,在以太网中使用48个bit来表示,常用6个以冒号分隔的十六进制的整数来表示,如: 00:0C:29:D2:58:6B
3、端口号(port):端口号是应用程序对于传输层的一个身份标识,传输层通过端口号来区分不同的应用程序,TCP和UDP采用16bit的端口号来识别应用程序
4、套接字(socket):由IP地址和端口号组合而成的地址,如:111.121.131.141.21指向IP地址为111.121.131.141的主机的21号端口
5、子网掩码(mask):类似于IP地址的32bit的地址,可以区分网络号和主机号,用于判断IP地址是否在本地子网内
6、域名系统(DNS):域名系统是一个分布的数据库,提供IP地址和主机名之间的映射信息
7、IP首部的协议域:在IP首部中有一个长度为8bit的协议域,用于标识数据报来自于上层的哪一个协议
8、封装:当用户从本机的应用程序发送数据到网络上的某一台主机时,数据将从协议栈的顶部往下,逐层添加相应的首部(和尾部),然后到达链路层转换为比特流发送到传输介质,这个过程称为封装。其过程如下:
9、分用:当主机接收来自传输介质的数据时,比特流将从协议栈的底部往上,逐层去掉相应的首部(和尾部),并根据首部信息发送给指定的协议,最后根据端口号发送给应用程序,用户收到数据,这个过程称为分用。其过程如下:
10、标准文档:关于TCP/IP标准,可以访问 RFC文档
四、简单描述一次数据传输的全过程
假设现在我要从我的电脑上发送一份数据到某台主机,假设我使用传输层的TCP,那么具体流程将类似下面这样:
注:这里不讨论更深的细节,比如IP分片、ARP解析、丢包等
封装:①~④
①我将数据准备好,并点击了发送,应用程序通过指定端口将数据发送至传输层的TCP;(应用层)
②TCP加上TCP首部(包含源端口号和目的端口号等信息)后封装为TCP分段,传输层将TCP分段发送至网络层的IP;(传输层)
③IP加上IP首部(包含本机的IP地址和目的IP地址等信息,已经经过DNS解析)后封装为IP数据报,网络层将IP数据报发送至数据链路层;(网络层)
④数据链路层加上以太网首部和尾部后将IP数据报封装为以太网帧,经过更细分的子层将以太网帧转化为比特流,然后传输到我所在的子网的路由器;(数据链路层)
IP寻址和路由选择:⑤~⑥
⑤子网的路由器将比特流转化为以太网帧,数据链路层将以太网帧去掉以太网首部和尾部,发送至IP层;(数据链路层)
⑥IP层检查数据报的IP首部,先根据子网掩码判断目的IP地址是否在本地子网内:(网络层)
● 如果目的IP地址在本地子网内,路由器会将数据报封装后经数据链路层发送给指定主机或路由器
● 如果目的IP地址不在本地子网内,那么路由器将数据报封装后经数据链路层发送给当前路由所在的子网的路由器(向上一层的网络传送),路由器收到后继续执行⑤
分用:⑦~⑩
⑦目的主机收到比特流以后转化为以太网帧,去掉以太网首部和尾部,发送给网络层的IP;(数据链路层)
⑧IP检查IP数据报,发现目的IP地址就是本机IP地址,去掉IP首部后根据`协议域`发送给传输层的TCP;(网络层)
⑨传输层根据目的端口号将去掉TCP首部后的数据发送至指定的应用程序;(传输层)
⑩应用程序接收数据;(应用层)
至此,就完成了一次完整的数据传输~~