协议 + socket import 和 form xx import *的区别
一 . 网络通信协议
1 . osi 七层协议应表会传网数物(应用层 表示层 会话层 传输层 网络层 数据链路层 物理层)
2 .tcp/ip五层 或 tcp/ip四层
五层 应 传 网 数 物(应用层 传输层 网络层 数据链路层 物理层)
应用层 : 写的程序 最上边的一层 传输层 : 四层交换器/四层的路由器 网络层 : 路由器 三层交换机 数据链路层 : 网桥/以太网交换机 网卡 物理层 : 中继器 集线器 双绞线
四层 应 传 网络 网络接口 (应用层 传输层 网络层 网络接口层)
2.1 物理层 :将孤立的计算机连接起来
物理层功能:主要是基于电器特性 发送高低电压(电信号) 高电压对应数字1 低电压对应数字0.
2.2 数据链路层:
由来:单纯的电信号没有意义 只有规定好多少为一组的电信号代表什么意思才有意义
功能: 定义电信号的分组方式
2.2.1以太网协议(ethernet):
以太网头规定:
一组电信号构成一个数据包,叫做'帧'
每一数据帧分成 : 报头head 和数据data两部分
head包含(18个固定字节) 分别为 发送者/源地址,6个字节 接收者/目标地址 6个字节 数据类型,6个字节
data(数据类型) : (最短46字节, 最长1500字节)
所以 数据包的具体内容 : head长度 + data长度 最短64字节,最长1518字节 超出长度就分片发送
2.2.2 mac地址
head中包含的源地址和目标地址的由来 Ethernet规定 接入internet的设备都必须具备网卡 发送端和接收端的地址便是网卡地址,即mac地址.
2.2.3 网络层
由来 : 广播风暴
功能 : 引入一套新的地址 用来区分不同的广播域/子网,这套地址即网络地址.
ip协议:
规定网络地址的就是ip协议 ,它定义的地址就是IP地址 现在广泛采用的是ipv4 它规定网络地址由32位二进制数字表示
ip 协议 通过ip地址找mac地址
疑问:有了ip地址 为什么还要mac地址呢? 比如 电脑从a教室搬到b教室 IP可能会更改 如果没有mac地址意味着现在电脑还是上一个连接这个ip地址的电脑 传输给我的信息就不会传过来 也即 身份证号和手机号的关系 换号了但别人还是可以通过不断拨打手机号确认对方的身份证号 确认了就可以进行信息传递
总结 : ip协议的两个作用 为每台计算机分配ip地址 确定哪些地址在同一个子网络
ip数据包 也分为head 和 data 部分 该报=包直接放在太网包的data部分
ARP协议
由来 : 由于通信是基于mac的广播形式实现,计算机在发信息时获取自身mac是比较容易的,而获取目标主机的mac,就需要ARP协议.
功能 : 广播的方式发送数据包 获取目标主机的mac地址
2.2.4 传输层
由来 : 网络层帮我们区分子网 , 以太网层的mac帮我们找到主机mac码,但是只找到主机没有用,因为用的都是应用程序 而通过端口(应用程序与网卡关联的编号) 可以实现端口到端口的通信 也即端对端通信
tcp 协议:(把链接作为最基本对象 ,每一条的tcp连接都有两个端点,这种端点叫做套接字(socket)), 它的定义为端口号拼接到ip地址 即构成了套接字, 例如 ,若 ip 地址为 192.3.4.16 而 端口号为80 那么得到的套接字为192.3.4.16:80)
当应用程序希望通过tcp与另一个程序通信时,它会发送一个通信请求 这个请求必须被送到一个确切的地址.在双方'握手'之后, tcp将在两个应用程序之间建立一个全双工(full-duplex,双方都可以收发消息)的通信. 这个全双工的通信将占用两个计算机之间的通信线路 直到它被一方或双方关闭为止.
传输消息可靠 三次握手和四次挥手 (面试问到的概率较大)
udp 协议 传输速度快 但是不可靠 信息不一定会传输到
tcp 协议 面向连接 消息可靠 相对于udp来讲 传输消息慢; 面向流 无消息保护边界
udp 协议 面向不链接 消息不可靠 传输消息快 面向包 有消息保护边界
三次握手: (建立一个连接) 基于tcp协议 1 tcp服务器进程先创建传输控制块tcb,时刻准备接受客户进程的连接请求 此时服务器就进入了listen(监听)状态 :
2 tcp客户进程也是先创建传输控制块tcb 然后向服务器发出连接请求报文 , 这时报文首部中的同部位syn=1 , 同时选择一个初始序列号 seq = x,此时 , tcp客户端进程进入了 syn-sent(同步已发送状态)状态, tcp规定 syn报文段(syn = 1 的报文段) 不能懈怠 , 但需要消耗掉一个序号
3 tcp服务器收到请求报文后 如果同意连接 则发出确认报文 , 确认报文中应该 ack = 1 , syn = 1 确认号是ack = x + 1 , 同时也要为自己初始化一个序列号 seq = y , 此时tcp服务器进程进入了 syn-sent(同步已发送状态),这个报文也不能携带数据 , 但是同样要消耗掉一个序号.
4 tcp 客户进程收到确认后 还要向服务器给出确认.确认报文的ack = 1, ack = y + 1, 自己的序列号 seq = x + 1 此时 tcp连接建立 , 客户端进入 ESTABLISHED(已建立连接)状态 tcp规定 ack报文段可以携带数据 , 但是如果不携带数据则不消耗序列号.
5 当服务器收到客户端的确认后也进入ESTABLISHED状态 , 此后双方就可以开始通讯了.
为什么tcp客户端最后还要发送一次确认呢?
一句话 防止已经失效的连接请求报文突然又传到了服务器,从而产生错误
如果使用的是两次握手连接 假设这样一种场景 客户端发送了第一个请求连接并且没有丢失 , 只是因为在网络节点中滞留的时间太长了 , 由于客户端迟迟没有收到确认报文 , 以为服务器没有收到 于是重新发送 此后客户端和服务器经过两次握手完成连接 , 传输数据 然后关闭连接 此时此前滞留的那一次请求连接 网络通畅了到达了服务器 , 这个报文本应该是失效的 但是两次握手的机制将会让客户端和服务器再次建立连接 这将导致不必要的错误和资源的浪费
但是如果采用的是三次握手,就算那一次失效的报文传送过来了 服务端接受了失效报文 并回复确认报文 但是客户端不会再次发出确认 由于服务器收不到确认 就知道客户端并没有请求连接
四次挥手: (终止一个连接)
1 客户端 发出连接释放报文 , 并且停止发送数据 释放报文首部 , fin = 1, 客户端进入finfin-wait-1(终止等待1)状态.
2 服务器收到释放连接报文 , 发出确认报文 此时服务端就进入了CLOSE-WAIT(关闭等待)状态
3 客户端收到服务器的确认请求后, 此时客户端就进入了FIN-WAIT-2(终止等待2)状态 , 等待服务器发送连接释放报文
4 服务器将最后的数据发送完毕后 就向客户端发送连接释放报文 由于在半关闭状态 服务器很可能又发送一些数据 此时 服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
5 客户端收到服务器的连接释放报文后 必须发出确认 此时客户端就进入了TIME-WAIT(时间等待)状态. 此时tcp连接还没有释放 必须经过2**MSL(最长报文寿命)的时间后 , 当客户端撤销相应的tcb后, 才进入CLOSED状态.
6 服务器只要收到了客户端发出的确认 立即进入CLOSED状态. 同样撤销了tcb后 就结束了这次的tcp连接 服务器结束tcp连接的时间要早于客户端一些.
import 和 form xx import *的区别:
主要是针对socket模块的
import socket 的话 要用socket.AF_INET 会报错 说是没有AF_INET这个族 是因为 AF-INET这个值在socket的名称空间下 from socket import * 是把socket下的所有名字引入当前的名称空间.
更多精彩,可以关注楼主的公众号,
最全面的django面试题总结: 回复django面试题即可获取, pycharm供给激活压缩包, 回复pycharm破解包即可获取,破解步骤在我的这一篇博客(点我直达)已经破解百次, 屡试不爽.
以及其他楼主精心打造的原创文章,欢迎各位来访.