系列文章目录

tcp介绍

tcp特点

tcp客户端


一、tcp介绍

Tcp协议,传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义

TCP通信需要经过创建连接、传输数据、终止连接三个步骤

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中的“打电话”(注:之前学习的udp,在通信前,不需要建立相关的链接,只需要发送数据即可,类似于“写信”,数据有可能丢失,没有tcp安全)


二、tcp特点

1.   面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输

双方间的数据传输都可以通过这一个连接进行

完成数据交换后,双方必须断开连接,以释放系统资源

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用udp协议

2.   可靠传输

1)tcp采用发送应答机制

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

(举个例子:平时我们用迅雷下载电影,明明是在下载东西,而流量监控会显示我们的下载速度是几兆每秒,同时也会显示一个上传速度,可能显示十几K每秒,这个上传的就是反馈回去的应答。因为一部电影一般都是很多个G的大小,不可能一次性下载完成,实际上是分成了很多个小片段下载的,我们下载成功一个,程序就会上传反馈提示这个片段下载成功,然后再进行下一个片段的下载)

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段

tcp为了保证不发生丢包,就给每一个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收

然后接收端实体对已经成功收到的包发回一个相应的确认(ACK),如果发送端实体在合理的往返时延(RTT)内收到确认,name对应的数据包就被假设为丢失将会进行重传

3)错误校检

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

4)流量控制和阻塞管理

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

Tcp和udp的不同点

·面向连接(确认有创建第三方交握,连接已创建才做传输)

·有序数据传输

·重发丢失的数据包

·丢弃重复的数据包

·无差错的数据传输

·阻塞/流量控制

总的来说,tcp比udp更加高效,稳定,可靠。现在我们基本上都是用的tcp


三、Tcp客户端

所谓的服务器端:就是提供服务的一方。二客户端:就是需要被服务的一方

Tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机,插电话卡,设置铃声,等待别人打电话的流程话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程少很多

大概思路:

第一步:创建套接字

第二步:链接服务器

第三步:收发数据

第四部:关闭套接字

比之前的udp多了一步链接服务器

操作:

注:tcp使用send发送数据,而且tcp是发送之前就已经建立了连接,就不需要再写端口号了

代码:

import socketdef main():# 1. 创建tcp套接字tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 链接服务器# tcp_socket.connect(("192.168.2.101", 8080))server_ip = input("请输入要链接的服务器的ip:")server_port = int(input("请输入要链接的服务器的port:"))server_addr = (server_ip, server_port)tcp_socket.connect(server_addr)# 3. 发送数据/接收数据send_data = input("请输入要发送的数据:")tcp_socket.send(send_data.encode("utf-8"))# 4. 关闭套接字tcp_socket.close()if __name__ =="__main__":main()

输出结果:

控制台:

服务器端:


Python学习日记-第二十九天-tcp(客户端)相关推荐

  1. Python学习笔记第二十九天(N维数组(ndarray))

    Python学习笔记第二十九天 N维数组(ndarray) 构建阵列 索引阵列 ndarray的内部内存布局 阵列属性 内存布局 数据类型 其他属性 阵列接口 ctypes外部功能接口 Array方法 ...

  2. Python学习日记-第二十四天-飞机大战(敌机出场设计)

    系列文章目录 ·使用定时器添加敌机 ·设计Enemy 类 前言 昨天因为有事,所以没有及时更新 一.使用定时器添加敌机 游戏启动后,每隔一秒会出现一架敌机 每架敌机向屏幕下方飞行,飞行速度各不相同 每 ...

  3. Python学习日记-第二十六天-飞机大战(发射子弹和碰撞检测)

    系列文章目录 1.发射子弹 2.碰撞检测 一.发射子弹 1.1   添加发射子弹事件 Pygame的定时器使用套路非常固定: 定义定时器常量--eventtid 在初始化方法中,调用set_timer ...

  4. python学习的第二十五天:对PDF文件的读写操作

    文章目录 python学习的第二十五天:对PDF文件的读写操作 对Excel操作的补充 python的实用方法 获取指定文件下的所有内容 shutil模块(封装了高级的文件操作函数) PDF的相关操作 ...

  5. Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块

    Hmac模块 其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性. 关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Mess ...

  6. Python学习日记(二十八) hashlib模块、configparse模块、logging模块

    hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...

  7. Python学习日记(二十九) 网络编程

    早期的计算机通信需要有一个中间件,A要给B传东西,A必须要把信息传给中间件,B再把从中间件中拿到信息 由于不同机器之间需要通信就产生了网络 软件开发的架构 1.C/S架构 服务器-客户机,即Clien ...

  8. Python学习日记-第十四天-面向对象练习

    前言 今天主要是针对昨天学习的面向对象,进行两个练习. 一个是添加家具的练习 另一个是士兵开枪的练习 练习1: 添加家具 需求: 1.   房子 house 有户型,总面积和家具名称列表 ·新房子没有 ...

  9. python学习日记_第九天(ex20~21)

    L20 函数和文件 1.进一步学习文件读取,使用readline方法逐行读取,学习和使用seek控制指针指向文件中的指定位置(详见加分题seek备注.) #coding:utf-8 #习题 20: 函 ...

最新文章

  1. Java 效率工具之 Lombok
  2. 光伏“转化效率之王”IBC电池有多牛?
  3. 《恋上数据结构第1季》红黑树(未完)
  4. Eclipse注释模板设置详解
  5. 创建maven的web项目,并用jetty调试
  6. Java Lock的使用
  7. beego使用php,使用GO语言Beego框架开发一个简易留言板
  8. Knockout应用开发指南 监控属性(Observables)
  9. 关于校验与确认两步操作时,新增,修改需要考虑的问题
  10. 项目管理-PMP-第4章 项目范围管理
  11. 【DenseFusion代码详解】linemod数据集预处理过程
  12. 解决多线程编程中大并发数等待唤醒的问题
  13. 协议分析(微信网页版 wx2.qq.com)
  14. Carp后端开发文档
  15. MySQL生成36位、32位UUID以及32位大写的UUID
  16. POE方案之SI3402-B
  17. 小波变换的理解(适合新手短期内分析信号的高频特性f)
  18. 华为董事会名单大曝光:孙亚芳任正非等13名董事
  19. C++ primer 第十章 泛型算法
  20. C++课程设计----电话管理系统

热门文章

  1. Android(让你的安卓模拟器链接网络)
  2. 如何修改dede文章页上一篇下一篇"没有了"
  3. 编写一个AQI分析的Orange插件
  4. 计算机班级学情分析报告,班级学习情况中期总结
  5. STM32窗口看门狗的喂狗初值传递的思考
  6. 去中心化的社交媒体应用案例
  7. linux看32位还是64位,如何看linux是32位还是64位
  8. 大数据篇--数据倾斜
  9. (译)How to Create Top/Bottom Rounded Corners for Views?
  10. [附源码]java毕业设计远程在线教育平台