我是靠谱客的博主 任性自行车,这篇文章主要介绍网络编程TCP的应用1、TCP介绍2、TCP特点3、TCP和UDP的不同点4、UDP通信模型5、TCP通信模型6、TCP的客户端7、TCP服务器8、基于TCP的文件下载器9、TCP三次握手9、TCP四次挥手总结,现在分享给大家,希望可以做个参考。

文章目录

  • 1、TCP介绍
  • 2、TCP特点
    • 2.1、面向连接
    • 2.2、可靠传输
  • 3、TCP和UDP的不同点
  • 4、UDP通信模型
  • 5、TCP通信模型
  • 6、TCP的客户端
  • 7、TCP服务器
  • 8、基于TCP的文件下载器
  • 9、TCP三次握手
  • 9、TCP四次挥手
  • 总结

1、TCP介绍

TCP协议,传输控制协议(英语:Transmission Contron Protocol,缩写为TCP)是以中面向连接的、可靠的、基于字节流的传输层通信协议。由IETF的RFC793定义。

TCP通信需要经过创建连接、数据传送、终止连接三个步骤
在这里插入图片描述

2、TCP特点

2.1、面向连接

  • 通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连上的传输。
  • 双方间的数据传输都可以通过这一连接进行
  • 完成数据交换后,双方必须断开连接,以释放系统资源。
  • 这种连接是一对一的

2.2、可靠传输

1)TCP采用发送应答机制

  • TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

  • 发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
  • TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被重传。

3)错误校验

  • TCP用一个检验和函数来检验数据是否有错误;在发送和接收时都要计算校验

4)流量控制和阻塞管理

  • 流量控制用来避免主机发送的过快而使接收方来不及完全收下

3、TCP和UDP的不同点

  • TCP 是面向连接的,UDP 是面向无连接的
  • UDP程序结构较简单
  • TCP 是面向字节流的,UDP 是基于数据报的
  • TCP 保证数据正确性,UDP 可能丢包
  • TCP 保证数据顺序,UDP 不保证

4、UDP通信模型

在这里插入图片描述

5、TCP通信模型

在这里插入图片描述
在这里插入图片描述

6、TCP的客户端

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
''' 1、导入模块 2、创建socket套接字 3、建立TCP连接 connect(和服务器建立连接) 4、开始发送数据(到服务器) 5、关闭套接字 ''' # 1、导入模块 import socket # 2、创建socket套接字 #socket.SOCK_STREAM 是TCP的传输方式 #socket.SOCK_DGRAM 是UDP的传输方式 tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 3、建立TCP连接(和服务器建立连接) tcp_client_socket.connect(("192.168.145.1",8080)) # 4、开始发送数据(到服务器) tcp_client_socket.send("你好".encode()) #接收数据 recv_data=tcp_client_socket.recv(1024) #解码 recv_text=recv_data.decode("GBK") print(recv_text) # 5、关闭套接字 tcp_client_socket.close()

7、TCP服务器

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
''' 1.导入模块 2.创建套接字 3.绑定端口和ip 4.开启监听(设置套接字为被动模式) 5.等待客户端连接 6.收发数据 7.关闭连接 ''' # 1.导入模块 ''' 1.导入模块 2.创建套接字 3.绑定端口和ip 4.开启监听(设置套接字为被动模式) 5.等待客户端连接 6.收发数据 7.关闭连接 ''' # 1.导入模块 import socket # 2.创建套接字 tcp_serve_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 3.绑定端口和ip tcp_serve_socket.bind(("",8080)) # 4.开启监听(设置套接字为被动模式) #listen() 作用设置 tcp_serve_socket套接字为被动监听模式,不能再主动发送数据 #128 是允许最大的连接数, tcp_serve_socket.listen(128) while True: # 5.等待客户端连接 #accept()开始接收客户端连接,程序会进入阻塞状态(等待客户端连接) #如果客户端连接后,程序自动解除阻塞 #tcp_serve_socket.accept()的数据有两部分 #1)返回了一个新的套接字socket #2)客户端的IP地址和端口号 new_client_socket,client_ip_port=tcp_serve_socket.accept() # 6.收发数据 while True: #recv会让程序再次阻塞,收到信息后解除阻塞 recv_data=new_client_socket.recv(1024) #当接受的数据为空时表示客户端已经断开连接,服务端也要断开 if recv_data: recv_text=recv_data.decode("UTF-8") print("接收到[%s]的信息是:%s"%(str(client_ip_port),recv_text)) else: print("客户端已经断开连接") break #new_client_socket.close() 表示不能再和当前的客户端通信了 new_client_socket.close() # 7.关闭连接 #tcp_serve_socket.close() 表示程序不在接收客户端连接,已经连接的可以继续服务 tcp_serve_socket.close()

8、基于TCP的文件下载器

服务器.py

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
''' 1、导入模块 2、创建套接字 3、绑定端口 4、设置监听、设置套接字由主动为被动 5、接收客户端连接 6、接收客户端发送的文件名 7、根据文件名读取文件内容 8、把读取的内容发送给客户端(循环) 9、关闭和当前客户端的连接 10、关闭套接字 ''' # 1、导入模块 import socket # 2、创建套接字 tcp_serve_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 3、绑定端口 tcp_serve_socket.bind(("",8080)) # 4、设置监听、设置套接字由主动为被动 tcp_serve_socket.listen(128) while True: # 5、接收客户端连接 new_client_socket,client_ip_port=tcp_serve_socket.accept() # 6、接收客户端发送的文件名 recv_data=new_client_socket.recv(1024) file_name=recv_data.decode() print(file_name) try: # 7、根据文件名读取文件内容 with open(file_name,"rb") as file: # 8、把读取的内容发送给客户端(循环) while True: file_data = file.read(1024) if file_data: #判断是否读取到了文件的末尾 # 发送文件 new_client_socket.send(file_data) else: break except Exception as e: print("文件%s下载失败"%file_name) else: print("文件%s下载成功"%file_name) # 9、关闭和当前客户端的连接 new_client_socket.close() # 10、关闭套接字 tcp_serve_socket.close()

客户端.py

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
''' 1、导入模块 2、创建套接字 3、建立连接 4、接收用户输入的文件名 5、发送文件名到服务器 6、创建文件,并且准备保存 7、接收服务器发送的数据,保存到本地(循环) 8、关闭套接字 ''' # 1、导入模块 import socket # 2、创建套接字 tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 3、建立连接 tcp_client_socket.connect(("192.168.145.1",8080)) # 4、接收用户输入的文件名 file_name=input("请输入要下载的文件名:") # 5、发送文件名到服务器 tcp_client_socket.send(file_name.encode()) # 6、创建文件,并且准备保存 with open("C:/Users/haoli/Desktop/"+file_name,"wb") as file: while True: # 7、接收服务器发送的数据,保存到本地(循环) file_data=tcp_client_socket.recv(1024) #判断数据是否传送完毕 if file_data: file.write(file_data) else: break # 8、关闭套接字 tcp_client_socket.close()

9、TCP三次握手

所谓三次握手是建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务器总共发送三个包已确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 第一次握手:Client将标指SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,随后Client进入SYN_SENT状态,等待Server确认

  • 第二次握手:Server接收数据包后有标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态

  • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并讲数据包发送给Server,Server检查ack是否为k+1,ACK是否为1,如果正确则连接建立成功,Client和Server进去ESTABLISHED状态,完成三次握手,随后Client和Server之间可以开始传数据了
    在这里插入图片描述

9、TCP四次挥手

在这里插入图片描述

  • 第一次挥手:主机1(可以是客户端,也可以是服务器),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入 FIN_WAIT_1状态:这表示主机1没有数据要发送给主机2了

  • 第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgement number 为Sequence Number +1;主机1进入FIN_WAIT_2状态:主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了。

  • 第三次挥手:主机2向主机1发送FIN报文段,请求关闭,同时主机2进入CLOSE_WAIT状态

  • 第四次挥手:主机1收到2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段之后,就关闭连接;此时,主机1等待2MSL后以然没有收到回复,则证明Server端已正常关闭,此时,主机1也关闭连接。

总结

  • TCP面向连接、可靠i的、基于字节流的传输控制协议

  • TCP的特点

    复制代码
    1
    2
    3
    4
    5
    6
    7
    面向连接 可靠传输 应答机制 超时重传 错误校验 流量管控和阻塞管理
  • TCP通信模型

    复制代码
    1
    2
    TCP严格区分客户端和服务端
  • TCP客户端

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    导入模块 创建套接字 建立连接 tcp_client_socket.connect("服务端ip",服务端端口) 发送数据 tcp_client_socket.send("发送的内容") 接收数据 recv_data=tcp_client_socket.recv(1024) recv_data是接收数据的二进制形式 关闭套接字
  • TCP客户端

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    导入模块 创建套接字 绑定端口 开启监听 tcp_serve_socket.listen(128) 等待客户端连接 new_client_socket,client_ip_port=tcp_serve_socket.accept() new_client_socket 新的套接字,只是服务当前的客户端 client_ip_port 客户端的端口和IP地址 使用新的套接字接收客户端发送的信息 new_client_socket.recv(1024) 关闭新的套接字 new_client_socket.close() 关闭服务器套接字 tcp_serve_socket.close()
    • TCP三次握手

      复制代码
      1
      2
      三次握手是TCP建立连接的时候发送的三个数据包
    • TCP四次挥手

      复制代码
      1
      2
      TCP断开连接的时候发送的四个数据包

最后

以上就是任性自行车最近收集整理的关于网络编程TCP的应用1、TCP介绍2、TCP特点3、TCP和UDP的不同点4、UDP通信模型5、TCP通信模型6、TCP的客户端7、TCP服务器8、基于TCP的文件下载器9、TCP三次握手9、TCP四次挥手总结的全部内容,更多相关网络编程TCP内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部