协议 + socket import 和 form xx import *的区别 028
一 . 网络通信协议(了解)
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下的所有名字引入当前的名称空间.
协议 + socket import 和 form xx import *的区别 028的更多相关文章
- python import, from xx import yy
区别: 用import modulexx/packagexx.moduleyy是导入某一模块,如果想引用模块的内容(class, method,variables...)必须用全名,即 [module ...
- import Vue form 'vue’的意思
1.import Vue form ‘vue’ 写全的话是import Vue from ‘…/nodemouls/vue/list/vue.js’: 此时在webpack.base.conf.js中 ...
- python的import和form...import的区别
import和form...import的区别 参考链接 骏马金龙 https://www.cnblogs.com/lzc978/p/10105194.html 普通区别 import 使用impor ...
- python import xx和from xx import x 中的坑
先回顾一下理解程度 什么是不可变类型和可变类型? 可变类型是,修改变量后 引用的内存地址不变,引用的内存中的内容发生变化(是针对变量名的引用来理解). # 在a.py中定义了一个test属性 test ...
- import * as x from 'xx' 和 import x from 'xx'
普通xx.js文件 //不可变的依赖模拟数据 module.exports=[ { id: "d52dccfc-656d-11e8-b153-7cd30ad3aa7a", regi ...
- 基于TCP协议Socket通信
服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...
- svn import usage and not import .so file
svn import usage: svn import PATH URL 可以不检查仓库来实现.入文件或目录 for example: svn import /home/scott/xxx svn: ...
- OC #import和@class的用法和区别
OC #import和@class的用法和区别 import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑, ...
- vue中的import、export、requre的区别
在es6之前js一直没有自己的模块语法,为了解决这种尴尬就有了require.js的出现.在es6发布之后js又引入了import的概念使得不清楚两者之间的区别的同学在实际使用过程中造成了自己的误解, ...
随机推荐
- pecl的使用
1. 安装方法 : pecl install packagename, 安装目录在/usr/local/php7/lib/php/extensions 例如:pecl install sealog 2 ...
- SimpleFactoryPattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- 用C++实现void reverse(char* str)函数,即反转一个null结尾的字符串.
void reverse(char* str) { char *end = str, *begin=str; char temp; while(*end!='\0') { end++; } end-- ...
- c++ 类中模版成员函数
C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 templa ...
- Inheritance with EF Code First: Part 1 – Table per Hierarchy (TPH)
以下三篇文章是Entity Framework Code-First系列中第七回:Entity Framework Code-First(7):Inheritance Strategy 提到的三篇.这 ...
- SDUT 3341 数据结构实验之二叉树二:遍历二叉树
数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉 ...
- Osmotic Study ----Mysql Safe
Thanks Ichunqiu company.I have a chance to learn some lessons for free in five days till 10.1 this y ...
- Linux Wifi模块灰色解决办法
https://www.cnblogs.com/mcy0808/p/5415689.html -sudo gedit /etc/rc.local 连上了CUG但还是打不开网页,是不是需要编辑Conne ...
- WebGoat系列实验Denial of Service & Insecure Communication
WebGoat系列实验Denial of Service & Insecure Communication ZipBomb 服务器仅接收ZIP文件,将上传的文件解压,进行操作之后删除.已知服务 ...
- day02.2-常用Linux命令整理
Linux命令语法格式: 命令 [选项] [参数] 1). 命令:告诉Linux操作系统执行什么: 2). 选项:说明命令的运行方式.选项部分是以字符‘-’开始的: 3). 参数:说明 ...