博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 网络基础 之 网络协议
阅读量:5343 次
发布时间:2019-06-15

本文共 5929 字,大约阅读时间需要 19 分钟。

osi 七层协议

互联网协议按照功能不同分为osi七层或者tcp/ip 五层或tcp/ip 四层

 

tcp/ip 四层

1.应用层

2.传输层

3.网络层

4.网络接口层

 

tcp/ip 五层

1.应用层

2.传输层

3.网络层

4.数据链路层

5.物理层

 

tcp/ip 7层

1.应用层

2.表示层

3.会话层

4.传输层

5.网络层

6.数据链路层

7.物理层

每层运行常见物理设备

传输层==》四层交换机、四层的路由器

网络层==》路由器、三层交换机

数据链路层==》网桥、以太网交换机、网卡

物理层==》中继器、集线器、双绞线

tcp/ip 五层默写讲解

我们将应用层、表示层、会话层,从tcp/ip五层协议的角度来阐述每层的由来

与功能,搞清楚了每层的主要协议

就理解了整个互联网通信的原理

首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖

与下一层,所以我们从最下层开始切入,比较好理解

以太网协议:

早期的时候各个公式都有自己的分组方式,后来形成了统一的标准,即以太网协议

ethernet

ethernet规定

  一组电信号构成一个数据包,叫做 帧

  每一数据帧分成:报头head和数据data两部分

  head data

head 包含:(固定18个字节)

  发送者/源地址, 6个字节

  接收者/目标地址,6个字节

  数据类型,6个字节

 

data包含:(最短46字节,最长1500字节)

  数据包的具体内容

head 长度+data长度=最短64字节,最长1518字节,超过

最大限制就分片发送

 

mac地址:

head中包含的源和目标地址由来:ehernet规定接入

internet的设备都必须具备网卡,发送端和接收端的

地址便是指网卡的地址,即mac地址

mac地址:每块网卡出厂时都被烧制上一个世界唯一的

mac地址,长度为48为2进制,通常由12位16进制数表示

(前6位是厂商标号,后6位是流水线号)

 

广播:

有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过

arp协议获取另外一台主机的mac地址)

 

ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼

 

网络层

  网络层:有了ethernet、mac地址、广播的发送方式、世界上计算机

就可以彼此通信了,问题是世界范围的互联网是由

一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会受到,

这就是不仅仅是效率低的问题了,这会是一种灾难

 

网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

ip协议:

  规定:网络地址的协议叫ip协议,它定义的地址称之为IP地址

,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示

范围0.0.0.0-255.255.255.255

一个ip地址通常写成四段十进制数,例:172.16.10.1

ip地址分为两部分:

  网络部分:标识子网

  主机部分:标识主机

 

注意:单纯的ip地址只是标识了地址的种类,从网络部分

或主机部分都无法辨识一个ip所处的子网

子网掩码:

  所谓子网有掩码 就是标识子网络特征的一个参数,

他在形式上等同ip地址。也是一个32位二进制数字,它的网络

部分全部为1.主机部分全部为0.

比如ip地址

172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

 

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

 

比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,

172.16.10.1:10101100.00010000.00001010.000000001

255255.255.255.0:11111111.11111111.11111111.00000000

AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

 

172.16.10.2:10101100.00010000.00001010.000000010

255255.255.255.0:11111111.11111111.11111111.00000000

AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

结果都是172.16.10.0,因此它们在同一个子网络。

总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络

 

ip数据包

ip数据包也分为head和data部分,无需为ip包定义单独的栏位,直接放入

以太网包的datga部分

 

head:长度为20到60字节

data:最长为65,515字节。

而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

 

以太网头                ip 头                                     ip数据                         

 

 

ARP协议

arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送,在谈及以太网协议时候,我门了解到

通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议

arp协议功能:广播的方式发送数据包,获取目标主机的mac地址

 

协议工作方式:每台主机ip都是已知的

例如:主机172.16.10.10/24访问172.16.10.11/24

一:首先通过ip地址和子网掩码区分出自己所处的子网

场景 数据包地址
同一子网 目标主机mac,目标主机ip
不同子网 网关mac,目标主机ip

 

 

 

二:分析172.16.10.10/24与172.16.10.11/24处于同一网络(如果不是同一网络,那么下表中目标ip为172.16.10.1,通过arp获取的是网关的mac)

  源mac 目标mac 源ip 目标ip 数据部分
发送端主机 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据

 

 

 

三 这个包会以广播的方便时在发送端所处的自网内传输

所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己mac

 

传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序,

那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。

传输层功能:建立端口到端口的通信

补充:端口范围0-65535,0-1023为系统占用端口

tcp协议:

可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

以太网头 ip 头               tcp头               数据                                                    

 

udp协议:

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

以太网头 ip头                      udp头                            数据    

 

 

 

 

 

 

 

 

tcp三次握手和四次挥手

 

 首先客户端:

 进行连接请求:

SYS_SENT---------》SYN seq =x-----> LISTEN

      客户端向服务端发送请求

ESTABLISHED<--SYN seq=y,ACK=X+1<-SYN_RCVD

        服务器发送连接请求 和反馈客户连接成功

ESTABLISHED-----》ACK=y+1-->ESTABLISHED

 

CLENT WRITE----->seq=x+1 ACK=y+1-->read

CLENT <-------------ACK X+2-------------<----READ SERVER

 

FIN_WAIT_1------------->FIN seq=X+2 ACK=Y+1------------->CLOSE_WAIT

FIN_WAIT_2-------<------ACK X+3----------<----------------------CLOSE_WAIT

TIME_WAIT<-------------------------<-FIN seq=y+1-------------------LAST_ACK(CLOSE)

TIME_WAIT------------------------->-ACK =y+2--------------------->server

 

CLOSED:表示关闭状态(初始状态)。

 

LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。

 

SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

 

SYN_RCVD: 该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。

 

ESTABLISHED:表示连接已经建立。

FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是: FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。 FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。

FIN_WAIT_2:主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。

 

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

 

CLOSE_WAIT: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接。

 

LAST_ACK: 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,即可以进入到CLOSED可用状态。

 

tcp第十一种状态:

CLOSING:这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

 

 

 

 

 Client                                   server

SYN_SENT(此状态表示已经发送报文)   client发送报文 SYN seq=x 报文            SYN_RCVE (已接收到SYN报文)状态

ESTABLISHED(此状态表示已建立连接)   server发送报文 SYN seq=y,ACK=x+1  SYN_RCVE 状态

ESTABLISHED                               发送报文ACK=y+1          ESTABLISHED (接收到ACK报文)                                 

 

client(发送数据write)         client seq=x+1  ACK=y=1        server(接收数据read)

client(接收反馈)           server  ACK x+2            server(接收到数据)

 

 

FIN_WAIL_1[CLOSE]         client FIN seq=x+2 ACK=y+1        CLOSE_WAIT[此时等待关闭]

等待对方报文,但是主动发送FIN报文关闭连接                    {会在发送ACK 报文的时候进入此状态}

 

FIN_WAIL_2             server   ACK x+3             CLOSE_WAIT   

[此状态已经接收到ACK报文]

 

TIME_WAIT              server FIN seq=y+1            LAST_ACK(close)

[此状态表示收到对方报文]                            [此状态表示等待对方报文ACK]

 

 

TIME_WAIT             clent ACK=y=2                server closed

 

 

 

 

 

 

 

 

 

  

   

 

转载于:https://www.cnblogs.com/yanxiatingyu/p/9270129.html

你可能感兴趣的文章
ABAP EXCEL数据上传时因为栏位字符串过长而被截断的问题解决方法
查看>>
CF1076E Vasya and a Tree
查看>>
Linux 的基本操作(文件与目录管理)
查看>>
LeetCode 9. Palindrome Number
查看>>
python——排序
查看>>
同时使用Binding&StringFormat 显示Text【项目】
查看>>
过拟合与欠拟合 之原因和解决方法
查看>>
线段树+差分【p1438】无聊的数列
查看>>
如何修炼成某一领域的高手?
查看>>
关于deepin上谷歌浏览器会出现延时的问题
查看>>
Mobility Express部署外部镜像服务器
查看>>
关于Mobility Express转LAP注意事项
查看>>
web前端经典小题
查看>>
AutoCAD如何倒角 倒圆角 倒直角
查看>>
Office PPT中如何插入flash
查看>>
C# Fade Form Effect With the AnimateWindow API Function
查看>>
golang多维数组的切片
查看>>
IP 网际协议
查看>>
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>