基于UDP/TCP协议下的socket套接字
本篇文章我主要想用来介绍关于UDP、TCP协议的基本知识及两个的优缺点、基于这两种协议下的套接字的基本用法,以及最重要的个人理解。
1、什么是UDP/TCP协议?
UDP协议:是user datagram protocol即用户数据报协议的一种简称,是OSI参考模型中的一种无连接传输协议,其提供面向事物的不可靠信息传输服务。在网络中与TCP协议一样是用来处理数据包的,但是UDP有不提供数据包分组、组装和不能对数据包进行排序,即不保证数据的完整准确的传输。
TCP协议:是transmission control protocol即传输控制协议的一种简称,是一种面向连接的、可靠的、基于字节流的运输层的通信协议。
接下来我们主要介绍两者的区别及其优缺点:
1、TCP为面向连接的(如打电话需要先通过拨号建立连接),UDP是无连接的(如写信,只需知道对方地址即可把信发送出去。)
2、TCP提供可靠的服务(即通过TCP连接传送的数据,无差错、不丢失、不重复,且按序到达,如打电话能保证对方能够完整的得到自己的消息;)UDP则是尽最大的努力交付,不保证可靠交付。(如写信,我只管将芯发送出去,但是不能保证对方一定能收到,也无法保证信件在传输的过程中不被损坏或者串改等。)
(1)TCP采用发送应答机制
TCP发送的每个报文段必须等到对方确认收到才会认为这段报文发送成功。(2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。(3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。来保证数据的准确、不丢包。(4)流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。即接收方缓冲区每接收一个包就会给发送方发送一个提示,我这边缓冲区还能发送多少,用来提示发送方式是否继续发送。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或者广播通信。
4、每一条TCP连接只能是点对点的 ;而UDP支持一对多,多对一和多对多的交互通信。(就类似于电话(TCP)和广播(UDP)。)
5、TCP对系统资源的要求较多,而UDP对系统资源要求较少。
2、基于UDP协议下的socket套接字
由于在随笔中会介绍套接字,这里便不再复述,主要讲述一下基于UDP协议下的套接字的用法及其基本步骤,我们直接从实例中来介绍:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
#1.创建套接字对象
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2.绑定本地信息
udp_socket.bind(("",8080))
#3.发送信息/接收信息
# a.发送
send_data = input("enter messgae--->:") #键入输出内容
desk_addr = ("192.168.11.18",7878) #确定目标IP和端口
udp_socket.sendto(send_data.encode("utf-8"),desk_addr)
# b.接收
recv_data = udp_socket.recvfrom(1024)
recv_content =recv_data[0].decode("uft-8")
recv_addr = recv_data[1]
print("%s send : %s "%(recv_addr,recv_content))
# 4.关闭套接字
udp_socket.close()
解析案例:其实我们可以将UDP协议下的套接字实现通信可以看做写信,也可以看做广播找人。
1、创建套接字 --》 就类似文件处理的open函数,需要创建文件对象对文件进行读写操作操作,而socket套接字也是同样的道理,只不过socket套接字是对网络上数据进行读(接收信息)、写(发送信息)操作而已。同时需要注意的是参数:AF_INET是指服务器之间的网络通信,SOCK_DGRAM是指基于UDP协议的数据报式的socket套接字。
2、绑定本地信息 --》这一步主要针对信息的接收,就类型于写信要想别人给你回信那么你肯定要告诉别人地址,而其中的IP地址为"",即表示我这台主机上所有的IP收到的信息均可以被该端口进行接收。
3、发送信息 --》 就类似于写信,你需要知道对方的地址以及你的写信内容才能发出。注:数据在网络上的传输和硬盘等的存储均是以字节的格式即二进制的格式进行存储的,故在数据发送前需对其进行编码。
接收信息 --》 接收的数据是一个元组,元组的第一个元素为信息内容,第二个元素为元组,其中包含对方的IP地址和端口号。
4、关闭套接字 --》就像我进行完写信和收信的过程,我就不需要一直待在邮局。
3、基于TCP协议的套接字
基于TCP协议的套接字,通常用于C/S架构即客户端/服务端之间的通信,接下来我们看一下基于TCP协议下socket套接字实现通信数据传输的基本流程, 还是看案例吧:
实现客户端的基本流程:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#---------------------------客户端------------------------------
import socket
# 1、创建套接字对象
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、与服务端建立连接
client_socket.connect(("192.168.11.12",7878))
# 3、发送消息,接收消息
send_msg = input("enter message -->:")
client_socket.send(send_msg.encode("utf-8"))
recv_msg = client_socket.recv(1024)
print(recv_msg.decode("uft-8"))
# 4、关闭套接字
client_socket.close()
案例解析:其实可以将TCP协议下socket套接字进行通信看做给10086打电话:
1、创建套接字对象 :拥有一个可以打电话的手机,用来进行通信或者进行数据传输等,需要注意的是其参数为:AF_INET即使用IPV4进行服务器之间的网络通信,SOCK_STREA即拥有TCP协议的流式socket套接字。
2、与服务端建立链接 :打电话前的拨号,当然你在拨号前需要知道对方的电话号码,即对方的IP地址和端口号。
3、发送消息、接收消息:电话拨通了进行通话,但这与写信不同,我已经知道拨通了对方的电话,当然不需要再次输入对方的电话号码了,也不需要在每次听到对方说话时,都要对方附带一句:我是谁我在哪?。即发送信息和接收信息,都不会再涉及对方的IP地址和端口等问题。
4、关闭套接字 ;挂电话。
实现服务端的基本流程:
# ---------------------------服务端-----------------------------
import socket
# 1.创建监听套接字
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、绑定本地信息
server_socket.bind(("",7878))
# 3、监听
server_socket.listen(128)
# 4、接受客户端的链接,获得客户端的地址并且给其创建服务套接字
sc_socket,client_addr =server_socket.accept()
# 5、接收信息和发送信息
recv_meg =sc_socket.recv(1024)
print(recv_meg.decode("gbk"))
send_msg =input("server:enter message-->:")
sc_socket.send(send_msg.encode("utf-8"))
# 6、关闭服务套接字
sc_socket.close()
# 7、关闭监听套接字
server_socket.close()
解析:基于TCP协议的socket套接字进行通信的服务端实现的流程类似于 :10086的主机服务:
1、创建套接字 :10086的主机开机,注:通常而言在C/S架构中,服务器肯定是先工作的。
2、绑定本地信息: 首先我们需要只要若10086的一直换号码,那么我们需要业务帮助的时候,就需要到处咨询它的电话号码;故服务器的主机地址和端口号肯定是固定不变的。
3、监听 :既然10086的主机开始工作了,就在等待用户来电,即服务器在监听客户端的链接。
4、接受客户链接,获取客户地址并且创建服务套接字 :即10086的主机接到来电就安排10086的客户小姐为客户进行通讯服务,同时也会在来电显示上获得客户端的电话信息;即当客户端链接服务端时,服务端在获取客户端的信息时,也会创建套接字对象为该客户端进行服务,同时在客户端断开链接时,该服务套接字将会释放可能去服务下一个链接进来的客户端。
5、接收信息和发送信息:在接到客户的来电,10086安排的客服小姐会一直为你服务,直到通话结束。
6、关闭服务套接字 : 10086的客服挂电话。
7、关闭监听套接字 :10086主机关闭,全体下班。
综上所述:就是基于UDP、TCP协议下套接字的实现,当然只是介绍了两种类型套接字的基本实现流程以及自己的一些理解。