TCP网络编程

一、TCP简介

二、TCP网络程序--客户端

三、TCP网络程序--服务端

四、TCP知识总结

五、文件下载案例

六、3次握手和4次挥手

回到顶部

一、TCP简介TCP

1.TCP的简介

  TCP通信需要通过创建链接, 数据传送, 终止链接3个步骤

  

2.TCP的特点

  面向连接: 建立间接, 通信, 关闭连接. 这种连接方式是一对一的, 所以不支持广播模式

  可靠传输

    应答机制: TCP发送的报文段必须都得到接受方的应答,才可以进行下步传输

    超时重传: TCP发送报文段的时候, 会启动定时器, 在规定时间内没有回应, 就进行重发

    错误校验: 由发送端计算,然后由接收端验证, 在此过程中出现差误的话, 则会直接丢弃这个包

    流量控制和阻碍管理: 根据实际情况来进行调整发送速度

  优缺点:

    优点: 可靠, 稳定传输数据

    缺点: 传输速度慢, 占用系统资源高, 不可以进行广播传输

  TCP和UDP的区别:

TCP 面向连接; UDP 是不面向连接;

TCP 提供可靠的数据传输,也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP 不保证可靠的数据传输,容易出现丢包情况;

TCP 需要连接传输速度慢,UDP 不需要连接传输速度快

TCP 不支持发广播; UDP 支持发广播

TCP 对系统资源要求较多,UDP 对系统资源要求较少。

TCP 适合发送大量数据,UDP 适合发送少量数据

TCP 有流量控制,UDP 没有流量控制

二、TCP网络程序--客户端

***注意***

在使用windows的网络调试助手的过程中, 此软件传出的字节是GBK的编码, 但接收的过程中是Unicode的编码形式

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. # Author:Mr.yang
  4. import socket
  5.  
  6. # 1.买个电话 -- 创建TCP套接字 参数是 地址协议版本 套接字类型
  7. tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8.  
  9. # 2.拨号 创建和服务器的链接
  10. tcp_socket.connect(('192.168.33.68', 8080))
  11.  
  12. # 3.发送数据
  13. choose = input(">>>:")
  14. tcp_socket.send(choose.encode())
  15.  
  16. # 4.接受数据 阻塞等待数据 recv返回值一般情况下 就是对方发送的数据; 如果对方断开了链接 返回值就是 ''
  17. recv_data = tcp_socket.recv(1024)
  18. if not recv_data:
  19. print("对方断开链接")
  20. else:
  21. print(recv_data.decode('gbk'))
  22.  
  23. # 5.关闭套接字
  24. tcp_socket.close()

客户端

三、TCP网络程序--服务端

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. # Author:Mr.yang
  4. import socket
  5.  
  6. # 1.总机 - 创建TCP套接字<服务器套接字 监听套接字>
  7. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8.  
  9. # 2.固定号码 - 固定端口
  10. server_socket.bind(('', 8888))
  11.  
  12. # 3.安装客户服务系统 - 主动 -> 被动监听模式
  13. server_socket.listen(128)
  14.  
  15. while True:
  16. # 4.从等待服务区取出一个客户端用以服务 转接到分机 - 接受链接
  17. # (<socket.socket 和客户端关联起来的套接字对象), raddr=('172.17.99.129', 53614)>, ('172.17.99.129', 53614))
  18. client_socket, client_addr = server_socket.accept()
  19. print("接受来自%s的数据请求" % str(client_socket))
  20.  
  21. while True:
  22. # 5.使用分机进行深入的交流 - echo 回射服务器
  23. recv_data = client_socket.recv(1024)
  24. print("接受数据:%s" % recv_data.decode('gbk'))
  25. client_socket.send(recv_data.decode('gbk').encode())
  26. if not recv_data:
  27. print("客户端下线了")
  28. break
  29.  
  30. # 6.分机挂机
  31. client_socket.close()
  32.  
  33. # 7.主机挂机
  34. server_socket.close()

服务端

四、TCP知识总结

  1. 1.TCP 服务器一般情况下都需要绑定端口号,否则客户端找不到这个服务器
  2. 2.TCP 客户端一般不绑定端口号,使用随机生成的端口号即可
  3. 3.TCP 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 TCP 服务器时必须要做的
  4. 4. TCP 客户端和服务端建立好连接才可以收发数据,UDP 是不需要建立连接,直接就可以发送数据
  5. 5.当一个 TCP 客户端和服务端连接成功后,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
  6. 6.listen 后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
  7. 7.关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
  8. 8.关闭 accept 返回的套接字意味着这个客户端已经服务完毕
  9. 9.当客户端的套接字调用 close 后,服务器端会 recv 解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

五、文件下载案例

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. # Author:Mr.yang
  4. import socket
  5.  
  6. # 1.建立和服务器的连接
  7. # 1.1 用户输入IP地址和端口
  8. IP = input("服务器IP:")
  9. port = int(input("服务器端口:"))
  10.  
  11. # 1.2 创建TCP套接字
  12. tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  13.  
  14. # 1.3 连接服务器
  15. tcp_socket.connect((IP, port))
  16.  
  17. # 2.向服务器发送需要下载文件的名称
  18. # 2.1 输入文件名称
  19. file_name = input('需要下载的文件名称:')
  20.  
  21. # 2.2 发送
  22. tcp_socket.send(file_name.encode())
  23.  
  24. # 3.一遍接收文件数据 一遍写入数据
  25. # 3.1 打开文件用于保存 接收到的数据
  26. file = open("下载" + file_name, "wb")
  27. while True:
  28. # 3.2 接收数据 写入文件
  29. file_data = tcp_socket.recv(4096)
  30.  
  31. # 3.3 如果数据是'' 传输完成 关闭文件 套接字 否则继续3.2的步骤
  32. if not file_data:
  33. print("文件下载完成")
  34. file.close()
  35. tcp_socket.close()
  36. break
  37. file.write(file_data)

客户端

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. # Author:Mr.yang
  4. import socket
  5.  
  6. def main():
  7.  
  8. # 1.创建和客户端的连接
  9. # 1.1 创建套接字
  10. tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  11. tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  12.  
  13. # 1.2 绑定端口
  14. tcp_socket.bind(('192.168.33.68', 8888))
  15.  
  16. # 1.3 监听
  17. tcp_socket.listen(128)
  18.  
  19. # 1.4 接收连接
  20.  
  21. while True:
  22. clent_socket, clent_addr = tcp_socket.accept()
  23. print("接收来自%s的连接" % str(clent_socket))
  24.  
  25. # 2.接收客户端发送的文件名
  26. # 2.1 使用和客户关联的套接字对象 接收数据
  27. file_name = clent_socket.recv(4096)
  28. if not file_name:
  29. print("客户端已经断开链接")
  30. clent_socket.close()
  31. continue
  32. # 2.2 文件名称解码成 str
  33. new_file_name = file_name.decode()
  34.  
  35. # 3.根据文件名称 读取文件数据 发送给客户端
  36. # 3.1 打开文件
  37. with open(new_file_name, "rb") as file:
  38. # 3.2读取整个文件的数据
  39. data = file.read() # 如果文件大 可能导致程序出现风险
  40.  
  41. # 3.3 向客户端发送数据
  42. clent_socket.send(data)
  43.  
  44. tcp_socket.close()
  45.  
  46. if __name__ == '__main__':
  47. main()

服务端

六、3次握手和4次挥手

3次握手

              

    标志位:

      SYN: 表示连接请求  ACK: 表示确认  FIN: 表示关闭连接  seq:表示报文序号  ack: 表示确认序号

  1. 第一次握手:
  2. Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给ServerClient进入SYN_SENT状态,等待Server确认。
  3.  
  4. 第二次握手:
  5. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYNACK都置为1ack (number )=J+1,随机产生一个值seq=K
    并将该数据包发送给 Client以确认连接请求,Server进入SYN_RCVD状态。
  6.  
  7. 第三次握手:
  8. Client收到确认后,检查ack是否为J+1ACK是否为1,如果正确则将标志位ACK置为1ack=K+1,并将该数据包发送给ServerServer检查ack是否为K+1ACK是否为1
    如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer之间可以开始传输数据了。

4次挥手

  1. 第一次挥手:Client发送一个FIN,用来关闭ClientServer的数据传送。
  2.  
  3. 第二次挥手:Server收到FIN后,发送一个ACKClient,确认序号为收到序号+1
  4.  
  5. 第三次挥手:Server发送一个FIN,用来关闭ServerClient的数据传送。
  6.  
  7. 第四次挥手:Client收到FIN后,接着发送一个ACKServer,确认序号为收到序号+1

网络传输--TCP的更多相关文章

  1. 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

    引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...

  2. 解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  3. C#网络程序设计(3)网络传输编程之TCP编程

        网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...

  4. 网络传输编程之TCP

    网络传输编程之TCP   网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议 ...

  5. UNIX网络编程——解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  6. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  7. TCP网络传输, 数据类型的问题

    转载: http://blog.csdn.net/highfly591/article/details/45309239 1.采用TCP传输时, 应用层为什么要做超时重传: tcp保证数据可靠传输,传 ...

  8. ASP.NET知识总结(1.网络传输层)

    1.网络传输层 1应用层(HTTP.FTP.SMTP)报文Message 2传输层(TCP.UDP)报文段Segment,为运行在不同主机上的应用程序进程间提供数据 传输服务.通过套接字(Socket ...

  9. udp 视频包网络传输花屏

    视频数据传输在传输层可以选择TCP或者UDP,TCP面向连接,传输中断,发送端是知道的.TCP传输的好处是不丢包,坏处是网络不太好的情况下会越堵越严重.UDP非面向连接,发送端只管发送数据,接收端有没 ...

随机推荐

  1. 【netcore基础】.NET Core使用EPPlus实现MVC API里的Excel导出功能 配置中文表头

    EPPlus 用来操作excel非常方便,不用依赖微软的office包,所以推荐使用. 下面是具体步骤和代码 首先用nuget安装 EPPlus.Core 我装的版本是 1.5.4 然后就可以用 Ex ...

  2. SQLServer2008 导出数据库表结构和数据

    很多朋友问到sql server数据库”生成脚本”,只导出了数据库的sql脚本,而表里的数据依然没有导出来.很简单,看教程: 注:我这里用的SQLServer2008,其它版本应该差不多. 一.选中要 ...

  3. H - Windows Message Queue

    Message queue is the basic fundamental of windows system. For each process, the system maintains a m ...

  4. tsm 存放磁带到带库

    1    磁带从带库中取放操作 1.1   checkout 磁带 查询checkout命令参数remove默认为yes 1.单盘磁带举例 #查看存储池 tsm>q stgpool f=d ts ...

  5. DB2创建数据库常用参数详解

    转自http://czmmiao.iteye.com/blog/1335801 DB2创建数据库常用参数详解 本文只介绍DB2 create database语法中的常用参数http://publib ...

  6. hdu3613 Best Reward【Manacher】

    Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. html笔记篇-Sublime、Markdown

    1.sublime优点:跨平台(Linux,Windows和Mac OS X).  体积小运行速度快.  支持编译功能  .支持大量的插件 2.sublime快速生成html文档:   !+tab键 ...

  8. [No000014E]提问的智慧How To Ask Questions The Smart Way

    原文版本历史 目录 声明 简介 在提问之前 当你提问时 慎选提问的论坛 Stack Overflow 网站和 IRC 论坛 第二步,使用项目邮件列表 使用有意义且描述明确的标题 使问题容易回复 用清晰 ...

  9. 关于Java的基础语法整理

  10. centos7安装zabbix3.4

    一.系统环境 关闭防火墙及selinux systemctl stop firewalld.service systemctl disable firewalld.service sed -i 's/ ...