1、tcp和udp的区别?
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,
且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP三次握手过程:
第一次握手:客户端(client)发送SYN包到服务器(server),
客户端(client)状态机进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器(server)接收到SYN包,必须发送ACK包到客户端,
同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端(client)接收到服务器发送的SYN+ACK包,
必须向服务器发送确认包ACK,此包发送成功,则客户端和服务器同时进入ESTABLISHED状态。
3次握手的特点:
没有应用层的数据
SYN这个标志位只有在TCP建产连接时才会被置1
握手完成后SYN标志位被置0
TCP建立连接要进行3次握手,而断开连接要进行4次
四次挥手:
假设客户端发起断开连接请求,
第一次挥手:客户端(client)发送FIN报文到Server端
第二次挥手:服务器(server)收到客户端发送的FIN包之后,发送ACK包到客户端,
客户端收到服务器发送的ACK之后,进入FIN_WAIT状态,等待server端发送FIN报文
第三次挥手:服务器(server)发送FIN报文到客户端
第四次挥手:客户端收到服务器发送的FIN报文之后,发送ACK包到服务器,
服务器收到ACK之后即断开连接,等待一段时间TIME_WAIT之后,
客户端发现服务器没有再发FIN过来,就知道服务器已经断开连接,此时客户端也进入断开连接状态。
名词解释:
ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.
比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
SYN 同步序列号,TCP建立连接时将这设置为1
FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这设置为1
2、对内存中栈和堆的了解?
栈(stacks):栈的特点是后进先出。只能通过访问一端来实现数据的储存和检索的线性数据结构。
a、栈的伸长和伸缩就是函数压入或者推出局部变量。
b、我们不用自己去管理内存,变量创建和释放都是自动的。
c、栈中的变量只有在函数创建运行时存在。
堆:
堆也是我们的计算机内存中的一个区域,但是他不是自动管理的。而且也不是被CPU密切的管理着。
它是一片更加自由的内存区域(很大)。要想在堆上创建内存,我们必须使用malloc() 或者calloc(),
他们都是C语言编译的。一旦你在堆上分配内存,当你不在需要的时候你必须用free()去销毁。如果你不销毁或者销毁失败,
你的程序就会有内存泄露。换句话说就是堆内存会一直在,其他进程无法使用。
不像栈,堆没有变量大小的限制(除了你电脑的物理限制条件外)。堆内存读出和写入都比较慢,因为它必须使用指针图访问堆内存。
栈和堆的优缺点:
栈:
a、快速访问。
b、没有必要明确的创建分类变量,因为它是自动管理的。
c、空间被CPU高效地管理着,内存不会变成碎片。
d、只有局部变量
e、受限于栈大小(取决于操作系统)
f、变量不能调整大小。
堆:
a、变量可以被全局访问
b、没有内存大小限制
c、(相对)访问比较慢
d、没有高效地使用空间,随着块内存的创建和销毁,内存可能会变成碎片。
e、你必须管理内存(变量的创建和销毁你必须要负责)
f、变量大小可以用realloc( )调整
3.字典、列表查询时的时间复杂度是怎样的?
列表是序列,可以理解为数据结构中的数组,字典可以理解为数据结构中的hashmap,python中list对象的存储结构采用的是线性表,
因此其查询复杂度为O(n),而dict对象的存储结构采用的是散列表(hash表),其在最优情况下查询复杂度为O(1)。dict的占用内存稍比list大,
会在1.5倍左右。
4、递归中如果没有终止条件会怎样?
递归如果没有终止条件会导致递归调用成为死循环而不能正常结束,并且会造成栈溢出
5.去除列表中的重复元素
list1 = [12,12,13,14,15,6,7,6,8,9,3,3,13]
# list1 = list(set(list1))
# print(list1)
def distinct_list(list):
d_l = []
for i in list1:
if i not in d_l:
d_l.append(i)
return d_l
ret = distinct_list(list1)
print(ret)