网络编程—tcp

          1、TCP简介数据库

          2、tcp网络程序-客户端后端

          3、tcp网络程序-服务器服务器

          4、案例:文件下载器网络

          5、tcp三次握手、四次挥手并发

          6、tcp长链接和短链接socket

          7、TCP/IP协议tcp

 

1、TCP简介ide

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通讯模型中,在通讯开始以前,必定要先创建相关的连接,才能发送数据,相似于生活中,"打电话""

 

 上去

2、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

 

上去

3、tcp网络程序-服务器

tcp服务器

生活中的电话机

若是想让别人能更够打通我们的电话获取相应服务的话,须要作如下几件事情:

  1. 买个手机

  2. 插上手机卡

  3. 设计手机为正常接听状态(即可以响铃)

  4. 静静的等着别人拨打

tcp服务器

如同上面的电话机过程同样,在程序中,若是想要完成一个tcp服务器的功能,须要的流程以下:

  1. socket建立一个套接字

  2. bind绑定ip和port

  3. listen使套接字变为能够被动连接

  4. accept等待客户端的连接

  5. recv/send接收发送数据

一个很简单的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注意点

  1. tcp服务器通常状况下都须要绑定,不然客户端找不到这个服务器

  2. tcp客户端通常不绑定,由于是主动连接服务器,因此只要肯定好服务器的ip、port等信息就好,本地客户端能够随机

  3. tcp服务器中经过listen能够将socket建立出来的主动套接字变为被动的,这是作tcp服务器时必需要作的

  4. 当客户端须要连接服务器时,就须要使用connect进行连接,udp是不须要连接的而是直接发送,可是tcp必须先连接,只有连接成功才能通讯

  5. 当一个tcp客户端链接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务

  6. listen后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept返回的新套接字是标记这个新客户端的

  7. 关闭listen后的套接字意味着被动套接字关闭了,会致使新的客户端不可以连接服务器,可是以前已经连接成功的客户端正常通讯。

  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕

  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,而且返回的长度为0,所以服务器能够经过返回数据的长度来区别客户端是否已经下线

 

上去

4、案例:文件下载器

服务器参考代码以下:

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

 

上去

5、tcp三次握手、四次挥手

tcp三次握手

 

 tcp四次挥手

 

上去

6、tcp长链接和短链接

TCP在真正的读写操做以前,server与client之间必须创建一个链接,

当读写操做完成后,双方再也不须要这个链接时它们能够释放这个链接,

链接的创建经过三次握手,释放则须要四次握手,

因此说每一个链接的创建都是须要资源消耗和时间消耗的。

 

TCP通讯的整个过程,以下图:

1. TCP短链接

模拟一种TCP短链接的状况:

  1. client 向 server 发起链接请求

  2. server 接到请求,双方创建链接

  3. client 向 server 发送消息

  4. server 回应 client

  5. 一次读写完成,此时双方任何一个均可以发起 close 操做

在步骤5中,通常都是 client 先发起 close 操做。固然也不排除有特殊的状况。

从上面的描述看,短链接通常只会在 client/server 间传递一次读写操做!

 

2. TCP长链接

再模拟一种长链接的状况:

  1. client 向 server 发起链接

  2. server 接到请求,双方创建链接

  3. client 向 server 发送消息

  4. server 回应 client

  5. 一次读写完成,链接不关闭

  6. 后续读写操做...

  7. 长时间操做以后client发起关闭请求

 

3. TCP长/短链接操做过程

3.1 短链接的操做步骤是:

创建链接——数据传输——关闭链接...创建链接——数据传输——关闭链接

 

3.2 长链接的操做步骤是:

创建链接——数据传输...(保持链接)...数据传输——关闭链接

 

 

4. TCP长/短链接的优势和缺点

  • 长链接能够省去较多的TCP创建和关闭的操做,减小浪费,节约时间。

    对于频繁请求资源的客户来讲,较适用长链接。

  • client与server之间的链接若是一直不关闭的话,会存在一个问题,

    随着客户端链接愈来愈多,server迟早有扛不住的时候,这时候server端须要采起一些策略,

    如关闭一些长时间没有读写事件发生的链接,这样能够避免一些恶意链接致使server端服务受损;

    若是条件再容许就能够以客户端机器为颗粒度,限制每一个客户端的最大长链接数,

    这样能够彻底避免某个蛋疼的客户端连累后端服务。

  • 短链接对于服务器来讲管理较为简单,存在的链接都是有用的链接,不须要额外的控制手段。
  • 但若是客户请求频繁,将在TCP的创建和关闭操做上浪费时间和带宽。

 

5. TCP长/短链接的应用场景

  • 长链接多用于操做频繁,点对点的通信,并且链接数不能太多状况。

    每一个TCP链接都须要三次握手,这须要时间,若是每一个操做都是先链接,

    再操做的话那么处理速度会下降不少,因此每一个操做完后都不断开,

    再次处理时直接发送数据包就OK了,不用创建TCP链接。

    例如:数据库的链接用长链接,若是用短链接频繁的通讯会形成socket错误,

    并且频繁的socket 建立也是对资源的浪费。

  • 而像WEB网站的http服务通常都用短连接,由于长链接对于服务端来讲会耗费必定的资源,

    而像WEB网站这么频繁的成千上万甚至上亿客户端的链接用短链接会更省一些资源,

    若是用长链接,并且同时有成千上万的用户,若是每一个用户都占用一个链接的话,

    那可想而知吧。因此并发量大,但每一个用户无需频繁操做状况下需用短连好。

 

上去

 7、TCP/IP协议(族)

早期的计算机网络,都是由各厂商本身规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容

为了把全世界的全部不一样类型的计算机都链接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议族(Internet Protocol Suite)就是通用协议标准。

由于互联网协议包含了上百种协议标准,可是最重要的两个协议是TCP和IP协议,因此,你们把互联网的协议简称TCP/IP协议(族)

经常使用的网络协议以下图所示:

说明:

网际层也称为:网络层

网络接口层也称为:链路层

另一套标准

 

相关文章
相关标签/搜索