学习网络首先要了解osi七层参考模型
为什么要有osi七层参考模型?
1.分层解耦,只要对应上下层的接口没有改变,每一层只需要关注自己的实现即可
2.应用层只需要关心业务实现,无需重复造轮子
七层参考模型图:
TCP协议是基于osi七层参考模型实现的
TCP分层:应用层(会话层、表示层),传输控制层,网络,数据链路,物理层
一.应用层
应用层协议举例:如http nc命令 和redis通讯等。
应用层协议主要是数据如何表示,如何封装,这叫做协议标准(固定的格式http请求,客户端与服务端都要遵循,才能正常解析对方的数据进行通讯)
举例:
linux演示和www.baidu.com进行简单通讯
nc:表示和服务器建立一个TCP连接
在TCP连接的基础上使用HTTP协议规范的字符串去访问百度的主页
HTTP协议规范:请求方式+path+协议版本+换行符
二、传输控制层
应用层协议准备好数据发送时,调用传输控制层(包含TCP UDP)。
TCP协议:面向连接,可靠的传输控制协议
1)面向连接:连接是什么 就是客户端与服务器之间发送syn数据包,经过3次握手,双方在内存里开劈相互对应的资源,资源的开劈就代表了连接的建立
连接建立后在内核表示为所谓的socket
Socket:源ip:port−>目标ip:port唯一连接
举例:查看所谓的socket
使用nc建立一个tcp连接
使用命令查看建立的连接:箭头所指就是我与百度建立的连接,Recv-Q,Send-Q就是开辟的资源(输入与输出)
2)可靠性:3次握手是为了建立连接,双方都会发送确认的数据包ack,确认双方的输入输出都没有问题,并且客户端或者服务端每发一个包对方都会回送一个确认收到ack,这就是TCP的可靠性。
简单查看3次握手过程:
首先对某一块网卡进行抓包
使用curl对百度进行访问:
然后看抓包情况:
三次握手之后双方可以进行数据传输,传输完毕,四次分手
数据传输:如上图 经过三次握手后,客户端向服务器发送一个HTTP协议的字符串来请求百度的资源,百度立刻回复一个ack来确认,我收到你得请求了,然后再给客户端发送数据包,这也说明了TCP的可靠性。
四次分手:具体交互见上图
数据传输完毕之后双方要释放资源
为什么要释放资源:因为资源是有限的 ,一台服务器端口号最大(65535),就和java使用连接或者流之类的道理是一样的。
总结:三次握手->数据传输->四次分手 成为一个最小粒度 不可被分割
三、网络层(IP)
传输控制层从三次握手建立连接−数据传输-四次分手断开连接。这个流程是线性的,完成这些工作还需要调用其他层次
应用程序想要建立连接socket,首先调用内核,内核会先准备三次握手的第一个包,调用网络层(ip协议),由网络层决定这个包怎么走
Rute -n 显示路由表,通过网卡配置生成 网卡配置:cat /etc/sysconfig/network-scripts/ifcfg-eth0
文字描述:
网络层决定从交换机直接把消息发出去还是从下一跳网关把这个消息发出去,这要看目标地址是否是本局域网。
如何计算是否走下一跳机制:通过目标地址与Genmak做按位与运算,然后与路由表Destination进行匹配
如果计算后是10.0.2.0就从交换机直接把数据包发出去,如果是0.0.0.0就会走下一跳机制,把数据包发送给默认网关,但目标ip不变
四、链路层(arp)
arp协议: 根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源
arp -a 查看MAC地址
arp协议抓包tcpdump -nn -i -eth0 port 80 or arp
3次握手的第一个包发送时首先在当前局域网由arp协议进行广播请求mac地址,找到下一跳网关的硬件地址并缓存,然后把目标地址和数据包发送给下一跳网关,网关发现目标ip不是自己,继续发给自己的下一跳网关,直到跳转到目标地址,这就是链路层。
最终跳转图如下:目标地址不变 变得是mac地址
总结:TCP/IP协议基于下一跳机制,ip是端点间的(发送端点->目标端点),mac是节点间的(每个节点间要换来换去)