tcp网络编程(Python网络编程 -- TCP/IP)

本文目录
- Python网络编程 -- TCP/IP
- 请问TCP网络编程有什么特点
- 嵌入式驱动开发需要学什么
- tcp网络编程与自动化的作用区别
- 网络编程基本概念,TCP/IP协议简介
- 北大青鸟设计培训:网络编程的协议连接问题
Python网络编程 -- TCP/IP
首先放出一个 TCP/IP 的程序,这里是单线程服务器与客户端,在多线程一节会放上多线程的TCP/IP服务程序。
这里将服务端和客户端放到同一个程序当中,方便对比服务端与客户端的不同。
TCP/IP是因特网的通信协议,其参考OSI模型,也采用了分层的方式,对每一层制定了相应的标准。
网际协议(IP)是为全世界通过互联网连接的计算机赋予统一地址系统的机制,它使得数据包能够从互联网的一端发送至另一端,如 130.207.244.244,为了便于记忆,常用主机名代替IP地址,例如 baidu.com。
UDP (User Datagram Protocol,用户数据报协议) 解决了上述第一个问题,通过端口号来实现了多路复用(用不同的端口区分不同的应用程序)但是使用UDP协议的网络程序需要自己处理丢包、重包和包的乱序问题。
TCP (Transmission Control Protocol,传输控制协议) 解决了上述两个问题,同样使用端口号实现了复用。
TCP 实现可靠连接的方法:
socket通信模型及 TCP 通信过程如下两张图。
socket.getaddrinfo(host, port, family, socktype, proto, flags)
返回: 由元组组成的列表。
family:表示socket使用的协议簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。
socktype: socket 的类型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3
proto: 协议, 套接字所用的协议,如果不指定, 则为 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17
flags:标记,限制返回内容。 AI_ADDRCONFIG 把计算机无法连接的所有地址都过滤掉(如果一个机构既有IPv4,又有IPv6,而主机只有IPv4,则会把 IPv6过滤掉)
AI _V4MAPPED, 如果本机只有IPv6,服务却只有IPv4,这个标记会将 IPv4地址重新编码为可实际使用的IPv6地址。
AI_CANONNAME,返回规范主机名:cannonname。
getaddrinfo(None, ’smtp’, 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)
getaddrinfo(’ftp.kernel.org’, ’ftp’, 0, ’socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)
利用已经通信的套接字名提供给getaddrinfo
mysock = server_sock.accept()
addr, port = mysock.getpeername()
getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)
TCP 数据发送模式:
由于 TCP 是发送流式数据,并且会自动分割发送的数据包,而且在 recv 的时候会阻塞进程,直到接收到数据为止,因此会出现死锁现象,及通信双方都在等待接收数据导致无法响应,或者都在发送数据导致缓存区溢出。所以就有了封帧(framing)的问题,即如何分割消息,使得接收方能够识别消息的开始与结束。
关于封帧,需要考虑的问题是, 接收方何时最终停止调用recv才是安全的?整个消息或数据何时才能完整无缺的传达?何时才能将接收到的消息作为一个整体来解析或处理。
适用UDP的场景:
由于TCP每次连接与断开都需要有三次握手,若有大量连接,则会产生大量的开销,在客户端与服务器之间不存在长时间连接的情况下,适用UDP更为合适,尤其是客户端太多的时候。
第二种情况: 当丢包现象发生时,如果应用程序有比简单地重传数据聪明得多的方法的话,那么就不适用TCP了。例如,如果正在进行音频通话,如果有1s的数据由于丢包而丢失了,那么只是简单地不断重新发送这1s的数据直至其成功传达是无济于事的。反之,客户端应该从传达的数据包中任意选择一些组合成一段音频(为了解决这一问题,一个智能的音频协议会用前一段音频的高度压缩版本作为数据包的开始部分,同样将其后继音频压缩,作为数据包的结束部分),然后继续进行后续操作,就好像没有发生丢包一样。如果使用TCP,那么这是不可能的,因为TCP会固执地重传丢失的信息,即使这些信息早已过时无用也不例外。UDP数据报通常是互联网实时多媒体流的基础。
参考资料:
请问TCP网络编程有什么特点
TCP网络编程的特点是:
1、由于网络的复杂性,传输信息时,数据包可能会丢失,差错控制中的确认机制在接收到数据包是发送确认信息,若是数据包丢失,则回发数据包编号,让对方重新发送;
2、由于网络的复杂性,传输信息时有多种网络传送途径可以选择,数据包被接收的顺序与发送顺序不同,可以根据数据包的编号,将数据包重组。
3、网络连接是以点对点的形式,加上上述特点,保证了数据的安全性,数据包不会中途被劫。
***隐藏网址***
嵌入式驱动开发需要学什么
嵌入式驱动开发需要学以下:
一:C语言
嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。
二:Linux基础
Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。
三:Linux系统编程
重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
四:Linux网络编程
计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。
重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。
五:数据结构与算法
数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。
此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
六:C++ 、QT
C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。
由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。
包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
tcp网络编程与自动化的作用区别
tcp网络编程与自动化的作用区别如下:
1、应用领域不同:TCP网络编程主要应用于计算机网络通信领域,帮助实现网络应用的开发和数据传输。而自动化技术则主要应用于工业自动化、智能家居及物联网等领域,帮助实现设备间的自动网络连接和智能控制。
2、技术方向不同:TCP网络编程是计算机网络和软件方面的技术,需要掌握编程语言、网络协议等软硬件知识。自动化技术则需要掌握传感器、控制器、通信技术等多个领域的专业知识。
3、目的不同:TCP网络编程的主要目的是实现两个或多个计算机之间的通信,从而帮助开发者、用户或设备之间进行数据交换。而自动化技术的主要目的则是实现产业智能自动化,提升产能、质量和智能化水平。
虽然TCP网络编程和自动化技术在应用领域、技术方向、目的等方面存在一定差异,但两者在物联网、智能家居、物流、工业互联网等领域的应用越来越多,也日益紧密地联系在一起。
网络编程基本概念,TCP/IP协议简介
网络基础知识 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯 网络编程中有两个主要的问题 一个是如何准确的定位网络上一台或多台主机 另一个就是找到主机后如何可靠高效的进行数据传输 在TCP/IP协议中IP层主要负责网络主机的定位 数据传输的路由 由IP地址可以唯一地确定Internet上的一台主机 而TCP层则提供面向应用的可靠的或非可靠的数据传输机制 这是网络编程的主要对象 一般不需要关心IP层是如何处理数据的 目前较为流行的网络编程模型是客户机/服务器(C/S)结构 即通信双方一方作为服务器等待客户提出请求并予以响应 客户则在需要服务时向服务器提出申请 服务器一般作为守护进程始终运行 监听网络端口 一旦有客户请求 就会启动一个服务进程来响应该客户 同时自己继续监听服务端口 使后来的客户也能及时得到服务 两类传输协议 TCP UDP 尽管TCP/IP协议的名称中只有TCP这个协议名 但是在TCP/IP的传输层同时存在TCP和UDP两个协议 TCP是Tranfer Control Protocol的简称 是一种面向连接的保证可靠传输的协议 通过TCP协议传输 得到的是一个顺序的无差错的数据流 发送方和接收方的成对的两个socket之间必须建立连接 以便在TCP协议的基础上进行通信 当一个socket(通常都是server socket)等待建立连接时 另一个socket可以要求进行连接 一旦这两个socket连接起来 它们就可以进行双向数据传输 双方都可以进行发送或接收操作 UDP是User Datagram Protocol的简称 是一种无连接的协议 每个数据报都是一个独立的信息 包括完整的源地址或目的地址 它在网络上以任何可能的路径传往目的地 因此能否到达目的地 到达目的地的时间以及内容的正确性都是不能被保证的 下面我们对这两种协议做简单比较 使用UDP时 每个数据报中都给出了完整的地址信息 因此无需要建立发送方和接收方的连接 对于TCP协议 由于它是一个面向连接的协议 在socket之间进行数据传输之前必然要建立连接 所以在TCP中多了一个连接建立的时间 使用UDP传输数据时是有大小限制的 每个被传输的数据报必须限定在 KB之内 而TCP没有这方面的限制 一旦连接建立起来 双方的socket就可以按统一的格式传输大量的数据 UDP是一个不可靠的协议 发送方所发送的数据报并不一定以相同的次序到达接收方 而TCP是一个可靠的协议 它确保接收方完全正确地获取发送方所发送的全部数据 总之 TCP在网络通信上有极强的生命力 例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输 相比之下UDP操作简单 而且仅需要较少的监护 因此通常用于局域网高可靠性的分散系统中client/server应用程序 读者可能要问 既然有了保证可靠传输的TCP协议 为什么还要非可靠传输的UDP协议呢?主要的原因有两个 一是可靠的传输是要付出代价的 对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽 因此TCP传输的效率不如UDP高 二是在许多应用中并不需要保证严格的传输可靠性 比如视频会议系统 并不要求音频视频数据绝对的正确 只要保证连贯性就可以了 这种情况下显然使用UDP会更合理一些 lishixinzhi/Article/program/Java/hx/201311/25841
北大青鸟设计培训:网络编程的协议连接问题
我们在前几期的文章中曾经给大家简单介绍了关于网络编程中不同协议的使用情况与运行的原理问题。
***隐藏网址***
1、为什么建立连接协议是三次握手,而关闭连接是四次挥手呢?这是因为服务端的LISTEN状态下的SOCKET收到SYN的请求连接时,可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里一起发送.但是关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送了,但是另一方未必所有的数据都全部发送完全了,所以可能不会立马关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方表示你同意现在关闭连接了,所以这里的2、ACK报文和FIN报文是分开发送的.为什么不能用两次握手进行连接?在三次握手中,总共需要完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已经准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认.现在把三次握手改成仅需要两次握手,是可能会发生死锁的.考虑计算机客户端和服务端之间的通信,假定客户端给服务端发送一个连接请求分组,服务端收到了这个分组,并发送了确认应答分组.按照两次握手的协定,服务端认为链接已经成功的建立了,可以开始发送数据分组.可是,客户端在服务端的应答分组在传输中被丢失的情况下,将不会知道服务端是否已准备好,不知道服务端建立什么样的序列号,客户端甚至会怀疑服务端是否收到自己的连接请求分组.在这种情况下,客户端认为连接还未建立成功,将忽略服务端发来的任何数据分组,只等待连接确认应答分组.而服务端在发出的数据分组超时后,重复发送同样的数据分组,就形成了死锁.3、为什么TIME_WAIT状态需要等2MSL后才能返回到CLOSED状态?什么是MSL?MSL即MaximumSegmentLifetime,也就是报文大生存时间.’MSL是任何报文段被丢弃前在网络内的长时间.’那么,2MSL也就是这个时间的两倍,当TCP连接完成四个报文段的交换时,主动关闭的一方将继续等待一定时间(2-4)分钟,即使两端的应用程序结束.4、为什么需要2MSL呢.一,虽然双方都同意关闭连接了,而且握手的四个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文.二,报文可能会被混淆,意思是说其他时候的连接可能会被当做本次的连接.当某个连接的一端处于TIME_WAIT状态时,该连接将不能再被使用.事实上,对于我们比较有现实意义的是,这个端口将不能再被使用.某个端口处于TIME_WAIT(其实应该是这个连接)状态时,这意味着这个TCP连接并没有断开(完全断开),那么.如果你bind这个端口,就会失败.对于服务器而言,如果服务器突然crash掉了,那么他将无法在2MSL内重新启动,因为bind会失败.解决这个问题的一个方法就是设置SOCKET的SO_REUSEADDR选项.这个选项意味着可以重用一个地址.当建立一个TCP连接时,服务端会继续用原有端口,同时用这个端口与客户端通信.而客户端默认情况下会使用一个随机端口与服务端的端口通信.有时候,为了服务端的安全性,我们需要对客户端进行验证,即限定某个IP的某个特定端口的客户端.客户端可以使用bind来使用特定的端口.对于服务端,当设置了SO_REUSEADDR选项时,它可以在2MSL内启动并listen成功.但是对于客户端,当使用bind并设置SO_REUSEADDR时,如果在2MSL内启动,虽然bind会成功,但是在windows平台上connect会失败.而在linux是哪个不存在这个问题.

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






