TCP:传输控制协议

tcp的特点:面向连接(打电话模型),可靠传输

tcp通信的三个步骤:

  1.通信双方建立连接

  2.收发收据

  3.关闭连接

tcp客户端实现流程

"""TCP客户端实现流程
1. 创建一个tcp 客户端对象
2. 与服务端建立连接
3. 通过tcp socket 收发数据
4. 关闭连接
关闭udp
"""
import socket def main():
#1. 创建一个tcp 客户端对象
tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 与服务端建立连接
# the address is a pair (host, port) # 元组 第一个元素是tcp服务端ip ,第二个元素是服务端的端口
server_addr=('192.168.44.79',8080)
tcp_client_socket.connect(server_addr) #连接服务器connect # 3. 通过tcp socket 收发数据
#3.1 发送数据到服务端
send_data=input("请输入您要发送的数据:")
tcp_client_socket.send(send_data.encode()) # 在linux中默认是utf-8编码 # 3.2 等待接收从服务端回传的消息
# (b'\xc4\xe3\xd2\xb2\xba\xc3', None)
# recv_data=tcp_client_socket.recvfrom(1024) # 每次最多接收1024字节 # b'good'
recv_data=tcp_client_socket.recv(1024) # 每次最多接收1024字节 # 把字节串转为字符串 解码
data=recv_data.decode('gbk') print("接收到的数据:",data) # 4. 关闭连接
tcp_client_socket.close() if __name__ == '__main__':
main() # alt+enter 快速修复

tcp服务端流程

"""tcp服务端创建流程
1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
2. 绑定端口
3. server_socket开启监听,由主动连接模式变为被动接受模式
4. 等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
5. 使用新创建的socket与客户端通信
6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
7. server_socket关闭,则不再接收新的客户端请求
"""
import socket def main():
#1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 复用同一个端口而不会提示端口被占用 ,解决当关闭的socket当处于time_out状态时, 也可立即使用端口
"""
socket.setsockopt(level,option,value) :配置socket
level:等级,对哪个等级操作(ip,tcp,udp,socket等级)
option:设置哪个选项
socket.SO_REUSEADDR: 复用地址
value: True:表示复用,False,表示不复用
"""
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 提示:socket.setsockopt()方法要在 socket.bind()之前设置 #2.绑定端口
server_socket.bind(('',9999)) #3. server_socket开启监听,由主动连接模式变为被动接受模式
server_socket.listen(5) # backlog 积压未办之事,好比排队队列,用于设置排队队列排队人数的最大值 #4.等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
# new_sock: 新创建的socket,用该socket与客户端通信
# client_addr :客户端的地址 # 为多个客户端提供服务
while True:
new_sock, client_addr=server_socket.accept()
print("有新的客户端请求,来自-->",client_addr) # 5.使用新创建的socket与客户端通信 # 为同一客户端提供多次服务
while True:
# 5.1 接收客户端的请求数据
# 当客户端的socket调用了close后,则会向服务端发送0长度的信息,且服务端解阻塞
recv_data=new_sock.recv(1024) if recv_data:
print("接收到的数据:",recv_data.decode('gbk')) #5.2 回复数据给客户端
new_sock.send("欢迎光临".encode())
else:
print("客户端已经下线...")
break # 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
new_sock.close() # 7.server_socket关闭,则不再接收新的客户端请求
server_socket.close() if __name__ == '__main__':
main()

小结:TCP与UDP的不同点:

    1.面向连接

    2.有序数据传输

    3.重发丢失的数据包

    4.舍弃重复的数据包

    5.无差错的数据传输

    6.阻塞/流量控制

TCP的三次握手与四次挥手

网络协议TCP的更多相关文章

  1. 网络协议TCP、Http、webservice、socket区别

    网络协议TCP.Http.webservice.socket区别 http 和 webservice 都是基于TCP/IP协议的应用层协议 webservice是基于http的soap协议传输数据 w ...

  2. 网络协议TCP/IP、IPX/SPX、NETBEUI简介

    网络中不同的工作站,服务器之间能传输数据,源于协议的存在.随着网络的发展,不同的开发商开发了不同的通信方式.为了使通信成功可靠,网络中的所有主机都必须使用同一语言,不能带有方言.因而必须开发严格的标准 ...

  3. python网络编程--socket,网络协议,TCP

    一. 客户端/服务端架构(用到网络通信的地方) 我们使用qq.微信和别人聊天,通过浏览器来浏览页面.看京东的网站,通过优酷.快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档 ...

  4. 网络体系结构的概念 - 网络协议TCP - 红黑联盟

    https://i.cnblogs.com/EditPosts.aspx?opt=1 网络体系结构的概念  计算机网络就是一组通过一定形式连接起来的计算机系统,它需要四个要素的支持,即通信线路和通信设 ...

  5. Go语言学习之9 网络协议TCP、Redis与聊天室

    主要内容 1. Tcp编程2. redis使用 1. Tcp编程 (1)简介       Golang是谷歌设计开发的语言,在Golang的设计之初就把高并发的性能作为Golang的主要特性之一,也是 ...

  6. [网络协议]TCP粘包分析

    关于socket粘包,socket缓冲区设置的问题,记录一下: 一 .两个简单概念长连接与短连接: 长连接     Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送 ...

  7. 31.网络协议介绍tcp/udp

    网络协议 TCP:网络中传输数据的协议,打电话 解决了我可能在网络中找不到别人(数据无法传输到) 保证数据传输的稳定性,可靠性 保证数据的安全性,完整性 对方要有响应 尝试重新发送 UDP:传输数据的 ...

  8. ****** 四十二 ******、软设笔记【网络基础】-IPv6协议、常用的网络协议

    一.IPv6协议 IPv6协议,全称"互联网协议第6版",即下一代的网际协议. 相对于IPv4来说,IPv6协议主要改进: *扩展的地址.IPv6地址长度为128位. *IPv6使 ...

  9. 分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击

    SOA(面向服务的架构):Service Oriented Architecture面向服务的架构.也就是把工程拆分成服务层.表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要 ...

随机推荐

  1. Swift4 构造体, 属性, 索引

    创建: 2018/02/19 完成: 2018/02/25 [任务表]TODO  构造体定义  定义的概要 struct 型名 { (变量/常量的定义) (构造函数的定义) (方法的定义) (其他定义 ...

  2. Educational Codeforces Round 14E. Xor-sequences(矩阵快速幂)

    传送门 题意 给定序列,从序列中选择k(1≤k≤1e18)个数(可以重复选择),使得得到的排列满足\(x_i与x_{i+1}\)异或的二进制表示中1的个数是3的倍数.问长度为k的满足条件的序列有多少种 ...

  3. zoj 2587 Unique Attack【最小割】

    拆点拆魔怔了 直接按照原图建就行,这里有个小技巧就是双向边的话不用按着板子建(u,v,c)(v,u,0)(v,u,c)(u,v,0),直接建(u,v,c)(v,u,c)会快十倍!800ms->8 ...

  4. 文件系统访问控制ACL设置

    1.传统Linux文件系统权限的问题 传统Linux文件系统有三类用户:文件属主-u,组用户-g,其它用户-o,以及三种访问权限:读-r,写-w,执行或目录进入-x,但很多时候并不能满足对文件访问的细 ...

  5. sigaction函数的功能

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...

  6. bzoj 1858: [Scoi2010]序列操作 || 洛谷 P2572

    记一下:线段树占空间是$2^{ceil(log2(n))+1}$ 这个就是一个线段树区间操作题,各种标记的设置.转移都很明确,只要熟悉这类题应该说是没有什么难度的. 由于对某区间set之后该区间原先待 ...

  7. 题解报告:hdu 1114 Piggy-Bank(完全背包恰好装满)

    Problem Description Before ACM can do anything, a budget must be prepared and the necessary financia ...

  8. 题解报告:CODE[VS] 1082 线段树练习3(区间修改+区间查询)

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  9. Tenegrad评价函数 分类: 图像处理 Opencv 2014-11-12 20:46 488人阅读 评论(0) 收藏

    Tenegrad函数式一种常用的图像清晰度评价函数,是一种基于梯度的函数. 在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值. Tenegrad函数使用Sobel算子提取水平 ...

  10. IIS中不让下级应用程序继承主域名的web.config配置

    <location path="." allowOverride="true" inheritInChildApplications="fals ...