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的编码形式

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

客户端

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

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

服务端

四、TCP知识总结

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

五、文件下载案例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket # 1.建立和服务器的连接
# 1.1 用户输入IP地址和端口
IP = input("服务器IP:")
port = int(input("服务器端口:")) # 1.2 创建TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 1.3 连接服务器
tcp_socket.connect((IP, port)) # 2.向服务器发送需要下载文件的名称
# 2.1 输入文件名称
file_name = input('需要下载的文件名称:') # 2.2 发送
tcp_socket.send(file_name.encode()) # 3.一遍接收文件数据 一遍写入数据
# 3.1 打开文件用于保存 接收到的数据
file = open("下载" + file_name, "wb")
while True:
# 3.2 接收数据 写入文件
file_data = tcp_socket.recv(4096) # 3.3 如果数据是'' 传输完成 关闭文件 套接字 否则继续3.2的步骤
if not file_data:
print("文件下载完成")
file.close()
tcp_socket.close()
break
file.write(file_data)

客户端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket def main(): # 1.创建和客户端的连接
# 1.1 创建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 1.2 绑定端口
tcp_socket.bind(('192.168.33.68', 8888)) # 1.3 监听
tcp_socket.listen(128) # 1.4 接收连接 while True:
clent_socket, clent_addr = tcp_socket.accept()
print("接收来自%s的连接" % str(clent_socket)) # 2.接收客户端发送的文件名
# 2.1 使用和客户关联的套接字对象 接收数据
file_name = clent_socket.recv(4096)
if not file_name:
print("客户端已经断开链接")
clent_socket.close()
continue
# 2.2 文件名称解码成 str
new_file_name = file_name.decode() # 3.根据文件名称 读取文件数据 发送给客户端
# 3.1 打开文件
with open(new_file_name, "rb") as file:
# 3.2读取整个文件的数据
data = file.read() # 如果文件大 可能导致程序出现风险 # 3.3 向客户端发送数据
clent_socket.send(data) tcp_socket.close() if __name__ == '__main__':
main()

服务端

六、3次握手和4次挥手

3次握手

              

    标志位:

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

第一次握手:
Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。 第二次握手:
Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=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之间可以开始传输数据了。

4次挥手

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送。

第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+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. fiddler工作原理和代理设置

    1,什么是Fiddler Fiddler是一个http协议调试代理工具,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的 ...

  2. 01简单工厂模式SimpleFactory

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态 工厂方法模式.通过专门定义一个类来负责创建 其他类的实例,被创建的实例通常都具有共同的 父类. 二.模式中包含的角色及其职责 1.工 ...

  3. Git 学习笔记--删除错误提交的commit

    如果不小心把错误的commit给commit了,可以对其进行撤销 1.使用git log查看commit日志,找到错误提交前一版本commit的哈希值; 2.使用git reset --hard co ...

  4. Markdown 引用

    Markdown 使用 > 来标记区块引用,语法及效果如下: > 这是第一级引用 > > > 这是第二级引用 > > 现在回到第一级引用 > > ...

  5. 【本周主题】第三期 - JavaScript 内存机制

  6. 【CF679D】Bear and Chase 最短路+乱搞

    [CF679D]Bear and Chase 题意:近日,鼠国的头号通缉犯,神出鬼没的怪盗——Joker正于摩登市出没!对于名侦探Jack来说,这正是将其捉拿归案的大号时机.形式化地,摩登市可以看成一 ...

  7. YAML入门

    概要 YAML(是YAML Ain't Markup Language的缩写,尾音的发音类似Camel)是一种序列化数据的语言(类似json, xml),使用轻量高可读性的语法描述list, dict ...

  8. MySQL语言 数据库练习题分解。

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  9. ERP项目实施记录06

    自上月20以后,因厂里赶货,办公室人员有空也要去车间帮手,ERP的事就没动静了. 2014年1月10日开了个小组会议,认为第三方不是专业做本行业的,开发风险大:因此希望先开发一个报价软件试试. 明天第 ...

  10. 怎样将flac音频格式转换成MP3格式

    Flac音频格式怎样转换成MP3格式呢?随着现在音频格式的不断多样性,生活中很多时候我们都会遇到音频格式转换的问题,如flac音频转MP3的问题,那么我们应该如何去解决这个问题呢?下面我们就一起去来一 ...