今天跟大家分享的是,自己对网络协议的理解。主要介绍网络协议中的,数据链路层,网络层,和传输层。
四层协议的概述
1.购物与四层协议
2.各层协议如何相互协作--封装,分用 (组包,拆包)
数据链路层
1.以太网帧报文头
2.arp协议,及演示
3.两台电脑如何mac地址进行通讯的
网络层
1.ip头部 ip地址 公网 私网
2.路由表
3.nat网络转换协议
4.ip路由观察
5.ip分片观察
介绍传输层(只介绍TCP)
1.tcp报文头
2.三次握手与socket
3.请求序列号,确认序列号,已经超时重传
4.socket与三层协议的关系及几个问题
四层协议的概述
1.购物与四层协议
先通过一个故事来简单描述一下四层协议的各自功能。
家里要买一个40米的大佛像,到了店铺a(邯郸),选好了样式,店铺a告知要从店铺b(广州)运货回来。于是就有了以下运佛的故事。
我们先看两个店铺(传输层)做了些什么?
总的来说就是稳定的端对端(广州 [源]--邯郸 [目的地])传输
1.店铺a先给店铺b打了个电话,更准确的说应该不是打电话,而是写信,走快递,来回三次信件(三次握手),沟通了一下佛像运输问题,要分块运输(MSS),以及店铺a本地的仓储大小(window);
2.店铺b通过快递公司,把一块佛像寄送给店铺a,店铺a收到后立马给店铺b打了个电话,告知已经收到(数据接收确认报文);
3.一次一辆装载佛像的汽车自燃了,店铺b很久(超时时间)没有收到店铺a的回复电话,就立马把这块佛像又发了一遍。(丢包重发)
4.最后店铺a收到了所有的佛像块,组装成了40米的大佛(数据有序组装)。
5.一次店铺a收到了序号为5,6,9,8序号的佛块(无序接收),最后店铺a直接打电话回复收到9号了(不用每次都回复,可以一批回复一次)
接着我们看看快递公司(网络层)做了些什么?
总的来说是不稳定的端对端传输
1.快递公司看了看快递(不关心发的是什么),发现一车可以装下,就不需要再分块了(ip分片);
2.广州快递公司看了看目的地邯郸(ip),就发送到了最近的快递中心,比如说是福建福州快递中心,福州中心又发送到了杭州中心,。。。到了北京中心,北京中心又发给石家庄中心,最后石家庄发给了邯郸中心,邯郸中心发现地址就在本市(ip在本局域网),就收下了快递。(路由)
最后我们看看快递员(数据链路层)做了些什么?
不稳定的点对点传输(石家庄-邯郸)
1.比如说石家庄快递员收到快递,发现目的地是邯郸,然后用百度地图定位(arp),根据导航送货到了邯郸中心。
最后出现了网上购物(应用层,http),我们不需要再和店铺打交道了。
2.各层协议如何相互协作--封装,分用 (组包,拆包)
现在了解了各层协议的大概功能,我再看看,各个协议之间是如何协作的?
数据到达物理网络之前,会自上到下通过协议栈,每层协议都是通过添加自己的头部信息来实现本层协议的。
当帧到达主机,会沿着协议栈自底向上依次传递,各协议层通过处理帧中本层负责的头部数据,实现本层功能,并将帧上传到上层协议,直到应用程序。由此看出,只要我们掌握了各个头部信息,就能掌握各层的功能。
数据链路层
1.以太网帧报文
可以看出以太网帧限制了数据的大小最大为1500字节,这就是为什么ip层要分片。
2.arp协议,及演示
arp协议就是通过ip地址获取mac地址的报文。先看演示
先查看本地arp缓存表
没有目的IP,接着我们用tcpdump监听,同时ping 10.252.68.118
红色部分就是arp请求,和arp应答。
最后我们再看本地arp缓存发现目的地址已经缓存到arp缓存表中。
3.两台电脑如何mac地址进行通讯的
1.交换机如何工作的
线路上传输的是以太网帧(实际还有一层),以太网帧头部有源和目的地。
交换机工作原理:交换机维护了一张主机mac地址和交换机接口对应关系表。交换机在收到数据帧以后,会先记录数据帧中的源MAC的地址和对应的接口到表中,然后查看MAC地址表中是否有目标MAC地址的信息,如果有则将数据帧发送到对应的接口(单播),如果没有则将数据从非接收口发出去(广播)
2.两个用户之间信息传输流程
用户1想发送消息给用户2.并且知道了用户2的ip地址。
1.用户1查看arp缓存表,如果找到则直接发送,如果没有则发送一个arp请求(广播)。询问ipxxx的mac地址是多少?
2.交换机发现是广播,则将数据从非接收口发出。
3.用户2发现ip地址与自己相同,则将自己的mac地址发送给用户1
4.用户1收到后将mac地址存入arp缓存表中
3.如何获得ip
1.用户1的DHCP客户端(操作系统中的程序)先发送一个广播,寻找DHCP服务器。交换机收到报文,得到用户1的mac地址,与其端口绑定。交换机发现是广播,将消息分别发送到f1 f2接口(f0是报文发送方,不用再发送),特定格式的报文,只有DHCP服务器会回应。
2.DHCP服务器收到报文,从IP池中选址一个空闲IP地址,对应的网络掩码,缺省网关,域名服务器IP(DNS)。因为已经知道用户1的mac地址,就可以直接发送给用户1了。
网络层
IP头部
16位总长度整个IP数据报的长度,但受MTU限制最大1480个长度,(ip头部20个字节)
16位标识唯一表示一次发送的数据报,数据包分片时,所有的分片数据中的16位唯一标识都一样
3位分片标志,第一位保留,第二位表示禁止分片,第三位表示更多分片,指这个分片后面还有分片,除了最后一个分片,其它都是1.
13位偏移,指的是数据偏移,实际偏移量是 13左移动3位,分片报文长度必须是8的倍数
8位协议 icmp 1 tcp 6 udp 17
IP地址:Ip=网段号+主机号
例如:10.252.71.172netmask255.255.252.0
ip分为公有ip,私有ip,公有ip是全球唯一的,私有ip用局域网。
3个预留私有地址:
10.0.0.0– 10.255.255.255
172.16.0.0– 172.31.255.255
192.168.0.0– 192.168.255.255
IP路由
我们本机和路由器上都有路由表,主要功能是告诉计算机,要去目的地,下一跳怎么走。
路由选择过程:
1.完全匹配ip,没有匹配到走2
2.匹配相同网段,没有匹配到走3
3.默认路由网关
使用traceroute 查看跳转路径
traceroute 如果有**号,一般是服务器屏蔽了icmp报文,
traceroute 原理。 前面我们介绍ip头部时介绍过ttl也就是time to live, traceroute就是根据ttl,第一次发送时ttl为1,第二次为2,依次递推。 因为ttl每跳一次就会减1,做减法的路由器发现ttl为0时,就停止了转发,并向源发送主机,发送一条icmp报文,告述源主机报文失效了,这样我们就可以获得每个节点的路由器了。
了解了链路层,我们就可以把互联网的两个主机通讯串起来了。下面介绍一下,用户a是如何把一条以太网帧通过交换机,路由器,互联传送给服务器的。
1.用户a主机的ip层查看目的ip地址,从本地路由表中得出下一跳要去网关,于是ip地址写src:10.1.1.2 ,dst:4.4.4.4,mac地址写:src: aa-aa-aa-aa-aa-aa dst: bb-bb-bb-bb-bb-bb.
2.路由器发现目的ip不是本局域网,查路由表,下一跳到运营商路由器。ip地址写到 src:2.2.2.2 dst:4.4.4.4 mac地址写: src:bb-bb-bb-bb-bb-bb dst:运营商路由器mac地址。
3.多次跳转后到了目的主机的路由器,最后到了目的主机。
如果在同一个局域网中,有两个人同时访问了同一个远程服务,由于从路由器出去时把私有ip转换为公有ip,那么怎么区分发出请求的是哪台电脑?
于是就用到了nat转换
从图中看出,路由器为每个机器分配了不同的路由器端口号,来区分。
IP切片
如图,如果我们要发送一个data为1473字节的icmp报文,就会被ip网络层切分成2和3两部分。演示如下:
传输层(只介绍TCP)
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
URG紧急数据
因为有可选字节,所以需要头部报文长度
32位序号:我已经发送多少字节数据(不包括本次)
32位确认序号:我已经接收了多少字节数据。
MSS
MSS:Maxitum Segment Size 最大分段大小,分段的原因,为了能丢包重发(最小代价),只发丢失的,不用全发。
MTU: Maxitum Transmission Unit 最大传输单元
三次握手与socket函数
1.三次握手与socket函数
connect 在第二次通讯后返回,accept在第三次返回。
2.如果第三次回复丢失,如何处理?查到的理论知识,有兴趣的同学可以去查证一下
1.超时时间内发送数据,既然已经发送数据,说明ack已经发了,可以正常链接
2.超时时间内没有发送数据RST
3为什么是3次?
为什么是三次,不是两次 为了防止已过期的syn请求被服务器接收后占用服务器资源,已过期是指客户端先发了个syn请求,服务器没响应,然后客户端再发一次,成功和服务器通讯,并断开了链接。这时候第一次请求到了,服务器以为是新的请求,就分配了链接资源。同时三次也能证明双方的发送和接收是都没有问题的。
四次挥手发两次fin,是因为tcp是全双工的,双向发送,fin只能关闭自己的发送。
socket就是一个 网络编程接口
socket帮我们封装了传输层,网络层,数据链路层的实现
问题
•1.服务器accept接收到的套接字会不会占用主机端口号?
•2.服务器最大长连接数是多少?
•3.服务器如何实现几十万,上百万的长连接数?(不考虑内存,cpu)