网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、暗示层和应用层。
HTTP是高层协议,而TCP/IP是个协议集,包过很多的子协议。包罗:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议。
socket是对TCP/IP协议的封装和应用(措施员层面上)。也可以说,TPC/IP协议是传输层协议,主要办理数据如安在网络中传输,而HTTP是应用层协议,主要办理如何包装数据。
我们在传输数据时,可以只利用(传输层)TCP/IP协议,可是那样的话,假如没有应用层,便无法识别数据内容,假如想要使传输的数据有意义,则必需利用到应用层协议,应用层协议有许多,好比HTTP、FTP、TELNET等,也可以本身界说应用层协议。WEB利用HTTP协议作应用层协议,以封装HTTP文本信息,然后利用TCP/IP做传输层协议将它发到网络上。
而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket自己并不是协议,而是一个挪用接口(API),通过Socket,我们才气利用TCP/IP协议。实际上,Socket跟TCP/IP协议没有一定的接洽。Socket编程接口在设计的时候,就但愿也能适应其他的网络协议。所以说,Socket的呈现只是使得措施员更利便地利用TCP/IP协议栈罢了,是对TCP/IP协议的抽象,从而形成了我们知道的一些最根基的函数接口,好比create、listen、connect、accept、send、read和write等等。
TCP/IP只是一个协议栈,就像操纵系统的运行机制一样,必需要详细实现,同时还要提供对外的操纵接口。这个就像操纵系统会提供尺度的编程接口,好比win32编程接口一样,TCP/IP也要提供可供措施员做网络开拓所用的接口,这就是Socket编程接口。
有个较量形象的描写:HTTP是轿车,提供了封装可能显示数据的详细形式;Socket是动员机,提供了网络通信的本领。
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket自己不算是协议,就像上面所说,它只是提供了一个针对TCP可能UDP编程的接口。
操作Socket成立网络毗连的步调:
成立Socket毗连至少需要一对套接字,个中一个运行于客户端,称为ClientSocket ,另一个运行于处事器端,称为ServerSocket 。
套接字之间的毗连进程分为三个步调:处事器监听,客户端请求,毗连确认。
1。处事器监听:处事器端套接字并不定位详细的客户端套接字,而是处于期待毗连的状态,及时监控网络状态,期待客户端的毗连请求。
2。客户端请求:指客户端的套接字提出毗连请求,要毗连的方针是处事器端的套接字。为此,客户端的套接字必需首先描写它要毗连的处事器的套接字,指出处事器端套接字的地点和端标语,然后就向处事器端套接字提出毗连请求。
3。毗连确认:当处事器端套接字监听到可能说吸收到客户端套接字的毗连请求时,就响应客户端套接字的请求,成立一个新的线程,把处事器端套接字的描写发给客户端,一旦客户端确认了此描写,两边就正式成立毗连。而处事器端套接字继承处于监听状态,继承吸收其他客户端套接字的毗连请求。
HTTP链接的特点
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基本,也是手机联网常用的协议之一,HTTP协议是成立在TCP协议之上的一种应用。
HTTP毗连最显著的特点是客户端发送的每次请求都需要处事器回送响应,在请求竣事后,会主动释放毗连。从成立毗连到封锁毗连的进程称为“一次毗连”。
The Internet Protocol(协议)
IP就是一个32位无标记整数。IP地点通过DNS (Domain Name System) 数据库映射到域名
#!/usr/bin/env python # Foundations of Python Network Programming - Chapter 1 - getname.py import socket hostname = 'google.com' addr = socket.gethostbyname(hostname) print 'The address of', hostname, 'is', addr # The address of google.com is 173.194.72.113
Python网络编程:
Python提供了会见底层操纵系统Socket接口的全部要领,还提供了一组加密和认证通信的处事,SSL/TLS。
Sockets其实是一个文件描写符,差异于差异于当地文件,它毗连了网络上的一个文件。
1、建设一个UDP 当地毗连:
#!/usr/bin/env python import socket, sys s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) MAX = 65535 PORT = 1060 if sys.argv[1:] == ['server']: s.bind(('127.0.0.1', PORT)) print 'Listening at', s.getsockname() while True: data, address = s.recvfrom(MAX) print 'The client at', address, 'says', repr(data) s.sendto('Your data was %d bytes' % len(data), address) elif sys.argv[1:] == ['client']: print 'Address before sending:', s.getsockname() s.sendto('This is my message', ('127.0.0.1', PORT)) print 'Address after sending', s.getsockname() data, address = s.recvfrom(MAX) # overly promiscuous - see text! print 'The server', address, 'says', repr(data) else: print >>sys.stderr, 'usage: udp_local.py server|client'
#p#分页标题#e#
运行这段代码:
python filename.py server #Listening at ('127.0.0.1', 1060) #Address before sending: ('0.0.0.0', 0) #Address after sending ('0.0.0.0', 62892) #The server ('127.0.0.1', 1060) says 'Your data was 18 bytes' python filename.py client #The client at ('127.0.0.1', 62892) says 'This is my message'
2、建设长途毗连并验证收到的信息:
import random, socket, sys s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) MAX = 65535 PORT = 1060 if 2 <= len(sys.argv) <= 3 and sys.argv[1] == 'server': interface = sys.argv[2] if len(sys.argv) > 2 else '' s.bind((interface, PORT)) print 'Listening at', s.getsockname() while True: data, address = s.recvfrom(MAX) if random.randint(0, 1): print 'The client at', address, 'says:', repr(data) s.sendto('Your data was %d bytes' % len(data), address) else: print 'Pretending to drop packet from', address elif len(sys.argv) == 3 and sys.argv[1] == 'client': hostname = sys.argv[2] s.connect((hostname, PORT)) print 'Client socket name is', s.getsockname() delay = 0.1 while True: s.send('This is another message') print 'Waiting up to', delay, 'seconds for a reply' s.settimeout(delay) try: data = s.recv(MAX) except socket.timeout: delay *= 2 # wait even longer for the next request if delay > 2.0: raise RuntimeError('I think the server is down') else: break # we are done, and can stop looping print 'The server says', repr(data) else: print >>sys.stderr, 'usage: udp_remote.py server [ <interface> ]' print >>sys.stderr, ' or: udp_remote.py client <host>' sys.exit(2)
这里的s.connect((hostname, PORT))要领,可以让我们不消每次都挪用s.sendto('This is my message', ('127.0.0.1', PORT))。直接挪用
s.send('This is another message')。