一:tcp/ip协议
网络上两个计算机之间的数据通信,归根到底就是不同主机的进程交互,而每个主机的进程都对应着某个端口。也就是说,单独靠IP地址的无法完成通信的,必须要有IP和端口。
OSI七层模型和tcp/ip
ip协议是在网络层,负责在网络把一台主机的数据传输到另一台目标主机上。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。也就是目前为止,目标主机对收到的数据包的完整性还是未知的,也不知道传输是否面向连接还是无连接。
tcp协议在传输层,是建立在IP协议之上的。TCP协议是面向连接的,可靠传输,保证通信主机间数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
udp协议,同样是建立在IP协议之上,但是UDP协议面向无连接的通信协议,不保证数据包的顺利到达,不可靠传输。所以效率比tcp要高。
二:tcp编程
由于tcp是面向连接的,也就是连接前,断开后都要进行验证。
三次握手建立连接:
四次挥手:
服务端tco_server.py代码如下:
'''
Created on 2015-6-1
@author: lkz
'''
import socket
import threading
import time
def proc(sock,addr):
print 'Accept new connection from %s:%s...' % addr
sock.send('welcome!')
while True:
data=sock.recv(1024)
time.sleep(1)
if not data or data =='exit':
break
sock.send('hello %s!' % data)
sock.close()
print 'connect from %s:%s closed' % addr
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#1,创建socket对象
s.bind(('127.0.0.1',9999))#2,绑定端口,地址
s.listen(5)#3,监听状态
print 'waiting for connect!'
while 1:
sock,addr = s.accept()#4:接受建立连接
print 'accept is retunr(%s,%s)' % (sock,addr)
t = threading.Thread(target=proc,args=(sock,addr))
t.start()
tcp_client.py代码如下:
'''
Created on 2015-6-1
@author: lkz
'''
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#1创建对象
s.connect(('127.0.0.1',9999))#连接请求
print 'sucess connected!'
for data in ['L','K','Z','exit']:
print 'send %s' % data
s.send(data)#发送数据
print s.recv(1024)#接受数据
s.close()#释放连接
print 'connect closed'
运行结果:
服务端:
客户端:
三:UDP编程:
udp_server.py:
'''
Created on 2015-6-1
@author: Administrator
'''
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',4000))
while True:
data,addr = s.recvfrom(1024)
print 'received (%s) from %s ' % (data,addr)
s.sendto('hello %s !' % data,addr)
udp_client.py
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('client',('127.0.0.1',4000))
print s.recv(1024).decode('utf-8')
s.close()
由于不需要建立连接,相对比较简单。
运行结果:
服务端打印出:received (client) from ('127.0.0.1', 64627)
客户端打印出:hello client !