首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

网络协议—TCP

一、定义:

TCP协议是一种面向连接的、可靠的、基于字节流的网络传输层通信协议,这种协议就像是打电话一样,如果一方给另一方打电话,而另一方没有接,那么拨出方就无法将消息发送过去.

二、主要特点:

1、面向连接:

建立TCP连接的过程就像是拨通电话的过程,首先双方需要建立TCP连接,然后才能发送数据,数据发送完毕后再关闭连接。这种连接是一对一的,无法进行广播 .

2、可靠传输:

· TCP采用发送-应答机制:

每个发送出去的报文段都必须得到接收方的应答后,才能认为这个TCP报文段是传输成功的.

· 超时重传:

当报文段被发送出去之后,发送方会启动定时器,如果在一定的时间内没有收到应答(接收端发回的ACK),就重新发送这个报文段.

· 错误校验:

发送方与接收方会存在一些验证数据的机制,当数据在网络传输的过程中被修改过,那么这个数据包就直接被丢弃,以保证数据的真实性.

· 网络拥塞控制:

如果发现丢包率比较高,可能存在发送方发送的包无法被接收方及时接收的情况,那么就会自动控制发包的速度.

· 对数据包进行编号:

发送的数据有顺序,会按照编号对数据包排序

3、传输速度慢

4、占用系统资源高

三、使用场景:

当工作环境对网络通讯的质量要求较高时,为了确保数据的准确传输,则选择TCP,一般对于文件、邮件等应用时可以采用TCP作为传输层协议.

四、TCP网络编程:

1、使用TCP发送数据:

'''TCP发送数据'''

import socket# 创建TCP套接字,参数:1、ipv4;2、套接字类型(TCP),基于字节流,以字节为单位tcp_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 建立和服务器的连接,参数:1、(ip、port)tcp_send.connect(('127.0.0.1', 8000))

# 发送数据-接收数据while True: s = input('输入内容:') data = s.encode() tcp_send.send(data)

# 接收数据(阻塞),参数:1、单次接收最大字节数 recv_data = tcp_send.recv(4096) print(f'接收到的数据为:{recv_data.decode()}')

if not recv_data: # 关闭套接字 tcp_send.close() print('连接已断开')break

2、使用TCP接收数据:

'''TCP接收数据'''import socket

# 创建TCP套接字(服务的套接字,并不与客户端直接联系)tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定端口 bindtcp_server_socket.bind(('127.0.0.1', 8000))

# 监听 listen (将套接字转为被动监听模式), 参数:最大可等待客户端数量tcp_server_socket.listen(128)

# 接受客户端的连接并转接到与具体客户端联系的套接字上 accept# 返回值是与客户端直接联系的套接字对象与客户端地址组成的元组client_socket, client_address = tcp_server_socket.accept()print(f'接收到来自:{str(client_address)}的请求')

while True: # 接受数据(如果没有调用recv,则客户端会显示为远程主机强迫关闭了一个现有的连接) client_data = client_socket.recv(4096) print(f'接收的数据为:{client_data.decode()}')

if not client_data or client_data.decode() == 'over': print('客户端或服务端断开连接') client_socket.close() # 退出之前关闭与客户端直接联系的套接字 break

# 将接收到的数据再发给客户端 client_socket.send(client_data)

# 关闭套接字(服务端的socket)tcp_server_socket.close()

上述两段代码,可以在同一网络下自己和自己发消息(先启动服务端代码)

不管是本文所述的TCP协议还是之前文章中的UDP协议,都只是在简单的介绍其概念与特点以及基本的编程实现,在整个网络协议中,还有更多的内容未细说,后面都会介绍的.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200222A0KS2H00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券