# 基础知识:
- tcp/ip协议不是一个协议,是一个协议群,tcp/ip协议对应的四层模型,应用层、传输层、网络层、链路层。
## 各层到底做了啥?
- 链路层:
主要是将数据封装成数据帧,数据帧头部信息有源mac地址,目标mac地址,然后以广播形式通过物理介质(光纤、双绞线..)发送给目标主机。
为什么有ip地址还需要mac地址?
ip地址是分配的,可变动的,mac地址是每块网卡的身份标识,主机接入互联网必须使用网卡,网卡地址是一个机器全球唯一标识,所以通过mac地址找目标主机更可靠。
有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。
- 网络层:
发送者如何知道接收者的MAC地址?(arp协议)
发送者如何知道接收者和自己同属一个子网?(ip协议)
如果接收者和自己不在同一个子网,数据包如何发给对方(路由协议)
网络层有ip协议、arp协议、路由协议,主要是解决如上三个问题。
我认为该层主要是为了获取目标的mac地址。
ARP获取mac地址,ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,在数据包传输时要通过ip协议判断目标ip和源ip是否处于同一子网,如果不在,则通过路由协议将数据包转发给本子网的网关进行路由,最终由以太网广播给目标ip子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址。
- 传输层:
链路层主通过MAC地址明确主机的身份, 网络层通过IP地址明确了目标主机网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。
但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。而每台电脑都有可能同时运行着很多个应用程序,所以当数据包被发送到主机上以后,是无法确定哪个应用程序要接收这个包。
所以传输层传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。
传输层有udp、tcp协议,udp协议是面向无连接,tcp是建立在udp的基础上建立三次握手,确认连接可靠性。
主机A:我想发数据给你,可以么?
主机B:可以,你什么时候发?
主机A:我马上发,你接着!
- 应用层:
应用层常见的有http、ftp、smtp协议等,该层主要工作是定义数据格式并按照对应的格式解读数据。
例http协议,在头信息定义了content-type是json还是from表单提交。
## 总结:
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。
转自:https://my.oschina.net/u/3745555/blog/3070180
来源:oschina
链接:https://my.oschina.net/u/4126983/blog/3160474