1、tcp和udp的关系
tcp/ip是一个协议组,它可以分为四个部分,分别是:链路层、网络层、传输层、应用层
tcp和udp同属于tcp/ip的传输层
tcp是基于连接的协议,也就是说,在正式发送数据前,必须简历可靠的连接。tcp建立连接时需要进行三次握手,关闭连接时需要进行四次挥手,这就好像是在打电话一样。
udp是面向非连接的,它不要要和对方建立连接,而是直接把数据包发送过去,他不需要进行三次握手和四次挥手,这就好像写信一样,相对不可靠。
2、tcp和udp的使用场合
udp使用场合
对效率要求相对高,对准确性要求相对低的场景。udp一般用于即时通信、在线视频、网络语音电话
tcp使用场合
对效率要求相对低,对准确性要求相对高的场景,或者是要求有连接的场景。tcp一般用于文件传输协议(ftp、http)、发送或接收邮件(pop、 smtp)、远程登陆(telnet、ssh)
3、udp的简单实现
# 导入socket套接字 import socket # 创建udp套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 绑定端口和ip udp_socket.bind(('', 8000)) # 设置允许广播 udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # 获取用户需要发送的内容 mess = input("enter the information you want to send:") # 定义目标地址 dest_addr = ("255.255.255.255", 8000) # 发送输入的数据到指定的ip,255.255.255.255表示广播 udp_socket.sendto(mess.encode(), dest_addr) # 接收1024个字节的数据 recv_data, recv_addr = udp_socket.recvfrom(1024) # 打印接收到的数据,因为接收到的数据来自windows,所以需要使用gbk解码 print(recv_data.decode("gbk")) # 关闭套接字 udp_socket.close()
4、tcp的简单实现
# 服务器端 # 导入socket套接字 import socket # 创建tcp套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定本地ip和端口 server_socket.bind(("",8080)) # 设置监听状态,1表示统一时刻只能有一个链接 server_socket.listen(1) # 等待客户端链接 client_socket, client_addr = server_socket.accept() # 设置返回的信息,如果这样返回的话,使用浏览器访问将出现hellworld,因为http协议也是基于tcp的 mess = "HTTP/1.1 200 OK\r\n\r\nhello world" # 给客户端套接字发送数据 client_socket.send(mess.encode()) # 接受1024个字节的数据 recv_data = client_socket.recv(1024) # 打印数据并解编码 print(recv_data.decode("gbk")) # 关闭客户端套接字 client_socket.close() # 关闭服务器套接字 server_socket.close()
# tcp客户端 # 导入socket套接字 import socket # 创建tcp套接子 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立链接 client_socket.connect(("192.168.217.1", 8080)) # 获取需要发送的数据 send_data = input("enter you need to send:") # 发送数据 client_socket.send((send_data.encode())) # 接收1024个字节的数据 recv_data = client_socket.recv(1024) # 打印数据,因为是windows,所以需要gbk解码 print(recv_data.decode("gbk")) # 关闭套接字 client_socket.close()