6. 为何基于 tcp 协议的通信比基于 udp 协议的通信更可靠?
TCP 的可靠保证, 是它的三次握手双向机制, 这一机制保证校验了数据, 保证了他的可靠性.
而 UDP 就没有了, udp 信息发出后, 不验证是否到达对方, 所以不可靠.
7. 什么是 socket? 简述基于 tcp 协议的套接字通信流程.
网络上的两个程序通过一个双向的通信连接实现数据的交换, 这个连接的一端称为一个 socket.
基于 tcp 协议流程:
1. 服务器先用 socket 函数来建立一个套接字, 用这个套接字完成通信的监听.
2. 用 bind 函数来绑定一个端口号和 IP 地址. 因为本地计算机可能有多个网址和 IP, 每一个 IP 和端口有多个端口.
需要指定一个 IP 和端口进行监听.
3. 服务器调用 listen 函数, 使服务器的这个端口和 IP 处于监听状态, 等待客户机的连接.
4. 客户机用 socket 函数建立一个套接字, 设定远程 IP 和端口.
5. 客户机调用 connect 函数连接远程计算机指定的端口.
6. 服务器用 accept 函数来接受远程计算机的连接, 建立起与客户机之间的通信.
7. 建立连接以后, 客户机用 write 函数向 socket 中写入数据. 也可以用 read 函数读取服务器发送来的数据.
8. 服务器用 read 函数读取客户机发送来的数据, 也可以用 write 函数来发送数据.
9. 完成通信以后, 用 close 函数关闭 socket 连接.
8. 什么是粘包? socket 中造成粘包的原因是什么?
1 什么是粘包现象?
TCP 粘包是指发送方发送的若干包数据到接收方接收时粘成一包, 从接收缓冲区看, 后一包数据的头紧接着前一包数据的尾.
2 为什么出现粘包现象
(1) 发送方原因
TCP 默认会使用 Nagle 算法. 而 Nagle 算法主要做两件事:
1) 只有上一个分组得到确认, 才会发送下一个分组;
2) 收集多个小分组, 在一个确认到来时一起发送.
所以, 正是 Nagle 算法造成了发送方有可能造成粘包现象.
(2) 接收方原因
TCP 接收到分组时, 并不会立刻送至应用层处理, 或者说, 应用层并不一定会立即处理;
实际上, TCP 将收到的分组保存至接收缓存里, 然后应用程序主动从缓存里读收到的分组.
这样一来, 如果 TCP 接收分组的速度大于应用程序读分组的速度, 多个包就会被存至缓存, 应用程序读时,
就会读到多个首尾相接粘到一起的包.
3 什么时候需要处理粘包现象
1) 如果发送方发送的多个分组本来就是同一个数据的不同部分,
比如一个很大的文件被分成多个分组发送, 这时, 当然不需要处理粘包的现象;
(2) 但如果多个分组本毫不相干, 甚至是并列的关系, 我们就一定要处理粘包问题了.
比如, 我当时要接收的每个分组都是一个有固定格式的商品信息,
如果不处理粘包问题, 每个读进来的分组我只会处理最前边的那个商品, 后边的就会被丢弃. 这显然不是我要的结果.
4 如何处理粘包现象
(1) 发送方
对于发送方造成的粘包现象, 我们可以通过关闭 Nagle 算法来解决, 使用 TCP_NODELAY 选项来关闭 Nagle 算法.
(2) 接收方
遗憾的是 TCP 并没有处理接收方粘包现象的机制, 我们只能在应用层进行处理.
(3) 应用层处理
解决方法就是循环处理: 应用程序在处理从缓存读来的分组时,
读完一条数据时, 就应该循环读下一条数据, 直到所有的数据都被处理; 但是如何判断每条数据的长度呢?
两种途径:
1) 格式化数据: 每条数据有固定的格式 (开始符, 结束符), 这种方法简单易行,
但选择开始符和结束符的时候一定要注意每条数据的内部一定不能出现开始符或结束符;
2) 发送长度: 发送每条数据的时候, 将数据的长度一并发送, 比如可以选择每条数据的前 4 位是数据的长度,
应用层处理时可以根据长度来判断每条数据的开始和结束.
9.python 的 GIL
GIL 是 python 的全局解释器锁, 同一进程中假如有多个线程运行,
一个线程在运行 python 程序的时候会霸占 python 解释器 (加了一把锁即 GIL),
使该进程内的其他线程无法运行, 等该线程运行完后其他线程才能运行. 如果线程运行过程中遇到耗时操作,
则解释器锁解开, 使其他线程运行. 所以在多线程中, 线程的运行仍是有先后顺序的, 并不是同时进行.
多进程中因为每个进程都能被系统分配资源, 相当于每个进程有了一个 python 解释器,
所以多进程可以实现多个进程的同时运行, 缺点是进程系统资源开销大
10. 进程之间如何进行通信?
进程间通讯有多种方式, 包括信号, 管道, 消息队列, 信号量, 共享内存, socket 等
11. 什么是并发和并行?
并发: 交替做不同事的能力
并行: 同时做不同事的能力
你吃饭吃到一半, 电话来了, 你一直到吃完了以后才去接, 这就说明你不支持并发也不支持并行.
你吃饭吃到一半, 电话来了, 你停了下来接了电话, 接完后继续吃饭, 这说明你支持并发.
你吃饭吃到一半, 电话来了, 你一边打电话一边吃饭, 这说明你支持并行.
并发的关键是你有处理多个任务的能力, 不一定要同时.
并行的关键是你有同时处理多个任务的能力.
它们最关键的点就是: 是否是『同时』.
"""
来源: http://www.bubuko.com/infodetail-3034744.html