一、tcp和udp的区别?
一、TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接
二、TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,
且按序到达;UDP尽最大努力交付,即不保证可靠交付
三、TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等)
四、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯
五、TCP首部开销20字节;UDP的首部开销小,只有8个字节
六、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过来,就知道服务器已经断开链接,此时客户端也进入断开链接状态。python
名词解释:
ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号以前的数据段都收到了.
好比,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
SYN 同步序列号,TCP创建链接时将这设置为1
FIN 发送端完成发送任务位,当TCP完成数据传输须要断开时,提出断开链接的一方将这设置为1数组
二、对内存中栈和堆的了解?
栈(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倍左右。
四、递归中若是没有终止条件会怎样?
递归若是没有终止条件会致使递归调用成为死循环而不能正常结束,而且会形成栈溢出数据结构
5.去除列表中的重复元素
list1 = [12,12,13,14,15,6,7,6,8,9,3,3,13]app
# 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)tcp