1.IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。
2.TCP属于传输层,建立在IP协议之上,通过三次握手建立可靠的连接,然后对每个IP包编号,确保对方按顺序收到,丢包则重新发送。
3.三次握手:
1.客户端通过ip和端口号向服务器发起连接 发送 syn(同步序列编号) =j connect()函数 阻塞
2.服务器被动收到客户端请求 ,然后发送 ack (确认字符) =j+1 和 syn(同步序列编号) =k accpet()函数阻塞
3.客户端收到服务器的确认信号后,像服务器也发送一个确认信号:ack=k+1
4.客户端和服务器简单通信代码
(1)客户端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: liuyc
@file: tcp_client.py
@time: 2017/8/19 18:36
@describe:
"""
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
(2)服务器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: liuyc
@file: tcp_server.py
@time: 2017/8/19 19:33
@describe: tcp_server
"""
import socket
import threading
import time
# 首先,创建一个基于IPv4和TCP协议的Socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 然后 我们要绑定监听的地址和端口
s.bind(('127.0.0.1', 9999))
# 紧接着,调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量:
s.listen(5)
print('Waiting for connection...')
def handle_msg(scok, addr):
print("accept new connect from addr:{0}".format(addr))
sock.send(b"Welcome")
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == "exit":
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
s.close()
print("colse connect from addr:{0}".format(addr))
while True:
# 接受一个新的连接
sock, addr = s.accept()
# 创建线程来处理连接
t = threading.Thread(target=handle_msg, args=(sock, addr))
t.start()
2.UDP
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。
使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。