TCP:可靠的面向连接的协议,传输效率低,全双工通信,流数据传输。运用:web浏览器,电子邮件,文件传输程序
UDP:不可靠的,无连接的服务,传输效率高,面向数据包的传输,只能发短消息。运用:dns , 视频流 ,IP语音(VoIP)
根据MTU最大传输单元为1500(普遍),再减去报头,报尾,所以udp传输最多是1470余
tcp和udp的对比
tcp:交换数据前,必须先经过三次握手,tcp提供超时重发,丢弃重复数据,有检验数据,流控制功能
数据传输必须先要得到对方的确认,有时候网络问题,会造成数据的多次发送,断开必须四次挥手
udp:用户数据报协议,它只负责将数据传输出去,但是能不能到达目的地,它不会管,没有握手和挥手的原因,传输速度就会很快
socket
socket层,是应用层与tcp/ip 协议簇中间的软件抽象层,它是一组接口
1 基于tcp的socket
服务端:
conn,client_addr=sk.accept()
conn: <socket.socket fd=520, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 54805)>
client_addr:('127.0.0.1', 54805)

import socket sk=socket.socket() #默认使用tcp模式 sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #表示重用IP和端口,写在bind之前 sk.bind(('127.0.0.1',9000)) #绑定ip和端口,必须是一个元组, sk.listen() #监听,在pycharm3.4之后的版本,里面可以不写,要写的话,表示监听的链接数 conn,addr=sk.accept() #接收客户端链接 ,经历了 3 次握手 ret=conn.recv(1024) #接收客户端信息 print(ret) conn.send(b'hello') #向客户端发送信息 conn.close() #关闭客户端套接字,经历了 4 次挥手 sk.close() #关闭服务器套接字
客户端:

import socket sk=socket.socket() sk.connect(('127.0.0.1',9000)) ret=sk.recv(1024).decode('utf-8') sk.send('hello'.encode('utf-8')) sk.close()
对于一个tcp而言,客户端和server是一直被占用的,换句话说链接是阻塞的,其他客户端插不进去
2 基于udp协议的socket
服务端
msg,client_addr=server.recvfrom(1024) # 前面是信息,后面是客户端地址,例如:b'hello' ('127.0.0.1', 60936)

import socket lst = {'egon': '