一、TCP简介
TCP介绍
TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"。
TCP特点
1. 面向连接
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。
双方间的数据传输都可以通过这一个连接进行。
完成数据交换后,双方必须断开此连接,以释放系统资源。
这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
2. 可靠传输
1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
4) 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
TCP与UDP的不同点
udp通信模型
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信""
TCP通信模型
udp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""
二、tcp网络程序-客户端
tcp客户端
tcp客户端,并不是像之前一个段子:一个顾客去饭馆吃饭,这个顾客要点菜,就问服务员咱们饭店有客户端么,然后这个服务员非常客气的说道:先生 我们饭店不用客户端,我们直接送到您的餐桌上
如果,不学习网络的知识是不是 说不定也会发生那样的笑话 ,哈哈
所谓的服务器端:就是提供服务的一方,而客户端,就是需要被服务的一方
tcp客户端构建流程
tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机、查手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多
示例代码:
from socket import *
# 创建套接字
tcp_client_socket = socket(AD_INET, SOCK_STREAM)
# 目的地址
server_ip = input("服务端ip:")
server_port = input("服务端端口:")
# 链接服务器
tcp_client_socket.connect((server_ip, int(server_port)))
# 客户端发送信息
send_data = input("输入发送的信息:")
tcp_client_socket.send(send_data.encode('utf-8'))
# 接受服务端发来的信息
recv_data = tcp_client_socket.recv(1024)
print("收到的信息:%s" % recv_data.decode('utf-8'))
# 关闭套接字
tcp_client_socket.close()
View Code
三、tcp网络程序-服务器
tcp服务器
生活中的电话机
如果想让别人能更够打通咱们的电话获取相应服务的话,需要做以下几件事情:
tcp服务器
如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:
一个很简单的tcp服务器如下:
from socket import *
# 创建套接字
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定地址
tcp_server_socket.bind(('192.168.1.1', 8001))
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就
可以接收别人的链接了
tcp_server_socket.listen(128)
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, client_addr = tcp_server_socket.accept()
# 接受对方发来的消息
recv_data = client_socket.recv(1024)
print("收到的消息:%s" % recv_data.decode('utf-8'))
# 回复对方消息
send_data = input("回复消息:")
client_socket.send(send_data.encode('utf-8'))
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务
了,如果还需要服务,只能再次重新连接
client_socket.close()
# 关闭服务器的套接字
tcp_server_socket.close()
View Code
tcp注意点
四、案例:文件下载器
服务器参考代码如下:
from socket import *
def get_file(file_name):
try:
with open(file_name, 'rb') as f:
content = f.read()
return content
except:
print("%s文件不存在" % file_name)
def main():
# 创建套接字
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定地址
tcp_server_socket.bind(("192.168.1.1", 8002))
# 将主动套接字变为被动套接字
tcp_server_socket.listen(128)
while True:
# 等待客户端连接
client_socket, client_addr = tcp_server_socket.accept()
# 接受客户端发来的数据
recv_data = client_socket.recv(1024)
file_name = recv_data.decode("utf-8")
print("对方请求下载的文件:%s" % file_name)
file_content = get_file(file_name)
# 发送文件的数据给客户端
# 因为获取打开文件时是以rb方式打开,所以file_content中的数据已经是二
进制的格式,因此不需要encode编码
if file_content:
client_socket.send(file_content)
else:
client_socket.send("请求的文件不存在".encode('utf-8'))
# 关闭这个套接字
client_socket.close()
# 关闭服务器
tcp_server_socket.close()
if __name__ == '__main__':
main()
View Code
客户端 参考代码如下:
from socket import *
# 创建套接字
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的地址
server_ip = input("服务器ip:")
server_port = input("服务器port:")
# 连接服务器
tcp_client_socket.connect((server_ip, int(server_port)))
# 发送下载的文件名
file_name = input("下载的文件名:")
tcp_client_socket.send(file_name.encode('utf-8'))
# 接受文件
file_content = tcp_client_socket.recv(1024)
# 验证文件是否存在,存在就创建文件
if file_content.decode('utf-8') == "请求的文件不存在":
print("请求的文件不存在")
else:
with open("new_"+file_name, 'wb') as f:
f.write(file_content)
print("文件下载成功")
# 关闭套接字
tcp_client_socket.close()
View Code
五、tcp三次握手、四次挥手
tcp三次握手
tcp四次挥手
六、tcp长连接和短连接
TCP在真正的读写操作之前,server与client之间必须建立一个连接,
当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,
连接的建立通过三次握手,释放则需要四次握手,
所以说每个连接的建立都是需要资源消耗和时间消耗的。
TCP通信的整个过程,如下图:
1. TCP短连接
模拟一种TCP短连接的情况:
在步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。
从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!
2. TCP长连接
再模拟一种长连接的情况:
3. TCP长/短连接操作过程
3.1 短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
3.2 长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
4. TCP长/短连接的优点和缺点
5. TCP长/短连接的应用场景
七、TCP/IP协议(族)
早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容
为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议族(Internet Protocol Suite)就是通用协议标准。
因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议(族)
常用的网络协议如下图所示:
说明:
网际层也称为:网络层
网络接口层也称为:链路层
另外一套标准