应用层 | DHCP·DNS·FTP·Gopher·HTTP·IMAP4·IRC·NNTP·XMPP·POP3·SIP·SMTP·SNMP·SSH·TELNET·RPC·RTCP·RTP·RTSP·SDP·SOAP·GTP·STUN·NTP·SSDP |
表示层 | HTTP/HTML·FTP·Telnet·ASN.1 (具备表示层功能) HTTPS |
会话层 | ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC· RTCP·SMPP·SCP·SSH·ZIP·SDP (具备会话层功能) |
传输层 | TCP·UDP·TLS·DCCP·SCTP·RSVP·PPTP |
网络层 | IP(IPv4·IPv6)·ICMP·ICMPv6·IGMP·IS-IS·IPsec·BGP·RIP·OSPF·ARP·RARP |
数据链路层 | Wi-Fi(IEEE 802.11)·WiMAX(IEEE 802.16)·ATM·DTM·令牌环·以太网路·FDDI.帧中继·GPRS·EVDO·HSPA·HDLC·PPP·L2TP·ISDNSTP |
物理层 | 以太网路卡·调制解调器·电力线通讯(PLC)·SONET/SDH (光同步数字传输网)·G.709 (光传输网络)·光导纤维·同轴电缆·双绞线 |
各层的功能简述: 【1】物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各类传输介质的传输速率等。它的主要做用是传输比特流(就是由一、0转化为电流强弱来进行传输,到达目的地后在转化为一、0,也就是咱们常说的数模转换与模数转换),这一层的数据叫作比特。 【2】数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,这一层一般还提供错误检测和纠正,以确保数据的可靠传输。 【3】网络层:在位于不一样地理位置的网络中的两个主机系统之间提供链接和路径选择,Internet的发展使得从世界各站点访问信息的用户数大大增长,而网络层正是管理这种链接的层。 【4】传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性偏偏相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是经过这种方式传输的), 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,经常把这一层数据叫作段。 【5】会话层:经过传输层(端口号:传输端口与接收端口)创建数据传输的通路,主要在你的系统之间发起会话或者接受会话请求(设备之间须要互相认识能够是IP也能够是MAC或者是主机名)。 【6】表示层:可确保一个系统的应用层所发送的信息能够被另外一个系统的应用层读取。例如,PC程序与另外一台计算机进行通讯,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另外一台则使用美国信息交换标准码(ASCII)来表示相同的字符。若有必要,表示层会经过使用一种通格式来实现多种数据格式之间的转换。 【7】应用层: 是最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。 各层中涉及的协议的简单解释: 应用层 ·DHCP(动态主机分配协议) · DNS (域名解析) · FTP(File Transfer Protocol)文件传输协议 · Gopher (英文原义:The Internet Gopher Protocol 中文释义:(RFC-1436)网际Gopher协议) · HTTP (Hypertext Transfer Protocol)超文本传输协议 · IMAP4 (Internet Message Access Protocol 4) 即 Internet信息访问协议的第4版本 · IRC (Internet Relay Chat )网络聊天协议 · NNTP (Network News Transport Protocol)RFC-977)网络新闻传输协议 · XMPP 可扩展消息处理现场协议 · POP3 (Post Office Protocol 3)即邮局协议的第3个版本 · SIP 信令控制协议 · SMTP (Simple Mail Transfer Protocol)即简单邮件传输协议 · SNMP (Simple Network Management Protocol,简单网络管理协议) · SSH (Secure Shell)安全外壳协议 · TELNET 远程登陆协议 · RPC (Remote Procedure Call Protocol)(RFC-1831)远程过程调用协议 · RTCP (RTP Control Protocol)RTP 控制协议 · RTSP (Real Time Streaming Protocol)实时流传输协议 · TLS (Transport Layer Security Protocol)安全传输层协议 · SDP( Session Description Protocol)会话描述协议 · SOAP (Simple Object Access Protocol)简单对象访问协议 · GTP 通用数据传输平台 · STUN (Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议 · NTP (Network Time Protocol)网络校时协议 传输层 ·TCP(Transmission Control Protocol)传输控制协议 · UDP (User Datagram Protocol)用户数据报协议 · DCCP (Datagram Congestion Control Protocol)数据报拥塞控制协议 · SCTP(STREAM CONTROL TRANSMISSION PROTOCOL)流控制传输协议 · RTP(Real-time Transport Protocol或简写RTP)实时传送协议 · RSVP (Resource ReSer Vation Protocol)资源预留协议 · PPTP ( Point to Point Tunneling Protocol)点对点隧道协议 网络层 IP(IPv4 · IPv6) Internet Protocol(网络之间互连的协议) ARP : Address Resolution Protocol即地址解析协议,实现经过IP地址得知其物理地址。 RARP :Reverse Address Resolution Protocol 反向地址转换协议容许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。 ICMP :(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。 ICMPv6: IGMP :Internet 组管理协议(IGMP)是因特网协议家族中的一个组播协议,用于IP 主机向任一个直接相邻的路由器报告他们的组成员状况。 RIP : 路由信息协议(RIP)是一种在网关与主机之间交换路由选择信息的标准。 OSPF : (Open Shortest Path First开放式最短路径优先). BGP :(Border Gateway Protocol )边界网关协议,用来链接Internet上独立系统的路由选择协议 IS-IS:(Intermediate System to Intermediate System Routing Protocol)中间系统到中间系统的路由选择协议. IPsec:“Internet 协议安全性”是一种开放标准的框架结构,经过使用加密的安全服务以确保在 Internet 协议 (IP) 网络上进行保密而安全的通信。 数据链路层 802.11 · 802.16 · Wi-Fi · WiMAX · ATM · DTM · 令牌环 · 以太网 · FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN 物理层 以太网物理层 · 调制解调器 · PLC · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线
· 一组电信号构成一个数据包,叫作帧 · 每一数据帧分红:包头head和数据data两部分 head包含:固定18个字节 · 发送者/源地址,6个字节 · 接收者/目标地址 6个字节 · 数据类型 6个字节 data包含:最短46个字节,最长1500字节 ·数据包的具体内容 head长度 + data长度 = 最短64字节,最长1518字节,超过最大限制就分片发送
以太网头 | IP头 | IP数据 |
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
主机发送信息时将包含目标IP地址的ARP请求广播到网络上的全部主机,并接收返回消息,以此肯定目标的物理地址。
收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留必定时间,下次请求时直接查询ARP缓存以节约资源。
地址解析协议是创建在网络中各个主机互相信任的基础上的,网络上的主机能够自主发送ARP应答消息,其余主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就能够向某一主机发送伪ARP应答报文,使其发送的信息没法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
场景 | 数据包地址 |
同一子网 | 目标主机mac,目标主机ip |
不一样子网 | 网关mac,目标主机ip |
源mac | 目标mac | 源IP | 目标IP | 数据部分 | |
发送端主机 | 发送端mac | FF:FF:FF:FF:FF:FF | 172.16.10.10/24 | 172.16.10.11/24 | 数据 |
以太网头 | IP头 | TCP头 | 数据 |
以太网头 | IP头 | UDP头 | 数据 |
TCP---传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间创建一个TCP链接,以后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。 UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在传输数据报前不用在客户和服务器之间创建一个链接,且没有超时重发等机制,故而传输速度很快 如今Internet上流行的协议是TCP/IP协议,该协议中对低于1024的端口都有确切的定义,他们对应着Internet上一些常见的服务。这些常见的服务能够分为使用TCP端口(面向链接)和使用UDP端口(面向无链接)两种。 说到TCP和UDP,首先要明白“链接”和“无链接”的含义,他们的关系能够用一个形象地比喻来讲明,就是打电话和写信。两我的若是要通话,首先要创建链接——即打电话时的拨号,等待响应后——即接听电话后,才能相互传递信息,最后还要断开链接——即挂电话。写信就比较简单了,填写好收信人的地址后将信投入邮筒,收信人就能够收到了。从这个分析能够看出,创建链接能够在须要痛心地双方创建一个传递信息的通道,在发送方发送请求链接信息接收方响应后,因为是在接受方响应后才开始传递信息,并且是在一个通道中传送,所以接受方能比较完整地收到发送方发出的信息,即信息传递的可靠性比较高。但也正由于须要创建链接,使资源开销加大(在创建链接前必须等待接受方响应,传输信息过程当中必须确认信息是否传到及断开链接时发出相应的信号等),独占一个通道,在断开链接钱不能创建另外一个链接,即两人在通话过程当中第三方不能打入电话。而无链接是一开始就发送信息(严格说来,这是没有开始、结束的),只是一次性的传递,是先不须要接受方的响应,于是在必定程度上也没法保证信息传递的可靠性了,就像写信同样,咱们只是将信寄出去,却不能保证收信人必定能够收到。 TCP是面向链接的,有比较高的可靠性, 一些要求比较高的服务通常使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等。 而UDP是面向无链接的,使用这个协议的常见服务有DNS、SNMP、QQ等。对于QQ必须另外说明一下,QQ2003之前是只使用UDP协议的,其服务器使用8000端口,侦听是否有信息传来,客户端使用4000端口,向外发送信息(这也就不难理解在通常的显IP的QQ版本中显示好友的IP地址信息中端口常为4000或其后续端口的缘由了),即QQ程序既接受服务又提供服务,在之后的QQ版本中也支持使用TCP协议了。
1 源端口和目的端口,各占2个字节,分别写入源端口和目的端口; 2 序号,占4个字节,TCP链接中传送的字节流中的每一个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(若是还有的话)的数据序号应该从401开始; 3 确认号,占4个字节,是指望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这代表B正确的收到了A发送的到序号700为止的数据。所以,B指望收到A的下一个数据序号是701,因而B在发送给A的确认报文段中把确认号置为701; 4 数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远; 5 保留,占6位,保留从此使用,但目前应都位0; 6 紧急URG,当URG=1,代表紧急指针字段有效。告诉系统此报文段中有紧急数据; 7 确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在链接创建后全部报文的传输都必须把ACK置1; 8 推送PSH,当两个应用进程进行交互式通讯时,有时在一端的应用进程但愿在键入一个命令后当即就能收到对方的响应,这时候就将PSH=1; 9 复位RST,当RST=1,代表TCP链接中出现严重差错,必须释放链接,而后再从新创建链接; 10 同步SYN,在链接创建时用来同步序号。当SYN=1,ACK=0,代表是链接请求报文,若赞成链接,则响应报文中应该使SYN=1,ACK=1; 11 终止FIN,用来释放链接。当FIN=1,代表此报文的发送方的数据已经发送完毕,而且要求释放; 12 窗口,占2字节,指的是通知接收方,发送本报文你须要有多大的空间来接受; 13 检验和,占2字节,校验首部和数据这两部分; 14 紧急指针,占2字节,指出本报文段中的紧急数据的字节数; 15 选项,长度可变,定义一些其余的可选的参数。
应用程序 | FTP | TETP | TELNET | SMTP | DNS | HTTP | SSH | MYSQL |
熟知端口 | 2120 | 69 | 23 | 25 | 53 | 80 | 22 | 3306 |
传输层协议 | TCP | UDP | TCP | TCP | UDP | TCP |
1、TCP 服务器进程先建立传输控制块TCB,时刻准备接收客户进程的链接请求,此时服务器就进入了listen(监听)状态; 二、TCP客户进程也是先建立传输控制块TCB,而后向服务器发出链接请求报文,这时报文首部中的筒不为SYN=1,同时选择一个初始序列号seq=x,此时,TCP客户端进程进入了SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但须要消耗掉一个序号。 三、TCP服务器收到请求报文后,若是赞成链接,则发出确认报文。确认报文中应该ACK=1,SYN=1,确认号是ack=x+1,同时也要为本身初始化一个序列号seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带序列号,可是一样须要消耗掉一个序号。 四、TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,本身的序列号seq=x+1,此时,TCP链接创建,客户端进入eatablished(已创建链接)状态。TCP规定。ACK报文段能够携带数据,可是若是不携带数据则不消耗序号。 五、当服务端收到客户端的确认后也进入estableshed状态,此后双方就能够通讯了。
一句话,主要防止已经失效的链接请求报文忽然又传送到了服务器,从而产生错误。
若是使用的是两次握手创建链接,假设有这样一种场景,客户端发送了第一个请求链接而且没有丢失,只是由于在网络结点中滞留的时间太长了,因为TCP的客户端迟迟没有收到确认报文,觉得服务器没有收到,此时从新向服务器发送这条报文,此后客户端和服务器通过两次握手完成链接,传输数据,而后关闭链接。此时此前滞留的那一次请求链接,网络通畅了到达了服务器,这个报文本该是失效的,可是,两次握手的机制将会让客户端和服务器再次创建链接,这将致使没必要要的错误和资源的浪费。
若是采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文而且回复了确认报文,可是客户端不会再次发出确认。因为服务器收不到确认,就知道客户端并无请求链接。
数据传输完毕以后,双方均可释放链接。最开始的时候,客户端和服务端都是处于established状态,而后客户端主动关闭,服务器被动关闭。服务端也能够主动关闭,一个流程。 一、客户端进程发出链接释放报文,并中止发送数据。释放报文数据首部,FIN=1,其序列号为seq=u(等于前面已经传过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即便不携带数据,也要消耗掉一个序号。 二、服务器收到链接释放保温,发出确认报文,ACK=1,ack=u+1,而且带上本身的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发放了,可是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 三、客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这以前还须要接受服务器发送的最后的数据)。 四、服务器将最后的数据发送完毕以后,就像客户端发送链接释放报文,FIN=1,ack=u+1,因为在半关闭状态,服务器可能有发送了一些数据,假定此时的序列号weiseq=w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 五、客户端收到服务器的裂解释放报文后,必须发出确认,ACK=1,ack=w+1,而本身的序列号seq=u+1,此时客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP链接尚未释放,必须通过2**MSL(最长报文段寿命)的时间,当客户端撤销相应的TCB后,才进入CLOSE状态。 六、服务器只要收到了客户端发出的确认,当即进入CLOSE状态。同一样,撤销TCB后,就结束了此次的TCB链接。能够看到,服务器结束TCB链接的时间要比客户端早一些。
MSL(Maximum Segment Lifetime),TCP容许不一样的实现能够设置不一样的MSL值。 第一,保证客户端发送的最后一个ACK报文可以到达服务器,由于这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端尚未给我回应,应该是我发送的请求断开报文它没有收到,因而服务器又会从新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,而且会重启2MSL计时器。 第二,防止相似与“三次握手”中提到了的“已经失效的链接请求报文段”出如今本链接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可使本链接持续的时间内所产生的全部报文段都从网络中消失。这样新的链接中不会出现旧链接的请求报文。 为何创建链接是三次握手,关闭链接确是四次挥手呢? 创建链接的时候, 服务器在LISTEN状态下,收到创建链接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭链接时,服务器收到对方的FIN报文时,仅仅表示对方再也不发送数据了可是还能接收数据,而本身也未必所有数据都发送给对方了,因此己方能够当即关闭,也能够发送一些数据给对方后,再发送FIN报文给对方来表示赞成如今关闭链接,所以,己方ACK和FIN通常都会分开发送,从而致使多了一次。
三次握手: TCP是因特网中的传输层协议,使用三次握手协议创建链接。当主动方发出SYN链接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。这种创建链接的方法能够防止产生错误的链接。[1] TCP三次握手的过程以下: 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。 三次握手完成,TCP客户端和服务器端成功地创建链接,能够开始传输数据了。 四次挥手: 创建一个链接须要三次握手,而终止一个链接要通过四次握手,这是由TCP的半关闭(half-close)形成的。 (1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP因而发送一个FIN分节,表示数据发送完毕。 (2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。 注意:FIN的接收也做为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其余数据以后,由于,FIN的接收意味着接收端应用进程在相应链接上再无额外数据可接收。 (3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这致使它的TCP也发送一个FIN。 (4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1] 既然每一个方向都须要一个FIN和一个ACK,所以一般须要4个分节。 注意: (1) “一般”是指,某些状况下,步骤1的FIN随数据一块儿发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。[2] (2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。 (3) 当一个Unix进程不管自愿地(调用exit或从main函数返回)仍是非自愿地(收到一个终止本进程的信号)终止时,全部打开的描述符都被关闭,这也致使仍然打开的任何TCP链接上也发出一个FIN。 不管是客户仍是服务器,任何一端均可以执行主动关闭。一般状况是,客户执行主动关闭,可是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。[2] 为何是四次挥手,是由于TCP创建的是全双工通道,你和我断了,我仍是能够给你发消息的,因此你断了以后,也须要我进行断开连接,因此要进行四次挥手确认。
Socket又称为套接字,它是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口。 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来讲,一组简单的接口就是所有,让Socket去组织数据,以符合指定的协议。当咱们使用不一样的协议进行通讯时就得使用不一样的接口,还得处理不一样协议的各类细节,这就增长了开发的难度,软件也不易于扩展(就像咱们开发一套公司管理系统同样,报帐、会议预约、请假等功能不须要单独写系统,而是一个系统上多个功能接口,不须要知道每一个功能如何去实现的)。 因而UNIX BSD就发明了socket这种东西,socket屏蔽了各个协议的通讯细节,使得程序员无需关注协议自己,直接使用socket提供的接口来进行互联的不一样主机间的进程的通讯。 这就比如操做系统给咱们提供了使用底层硬件功能的系统调用,经过系统调用咱们能够方便的使用磁盘(文件操做),使用内存,而无需本身去进行磁盘读写,内存管理。socket其实也是同样的东西,就是提供了tcp/ip协议的抽象,对外提供了一套接口,同过这个接口就能够统1、方便的使用tcp/ip协议的功能了。 其实站在你的角度上看,socket就是一个模块。咱们经过调用模块中已经实现的方法创建两个进程之间的链接和通讯。也有人将socket说成ip+port,由于ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。 因此咱们只要确立了ip和port就能找到一个应用程序,而且使用socket模块来与之通讯。 历史:套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 所以,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通信。这也被称进程间通信,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
基于文件类型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,能够经过访问同一个文件系统间接完成通讯
基于网络类型的套接字家族
套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,还有一些其余的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是不多被使用,或者是根本没有实现,全部地址家族中,AF_INET是使用最普遍的一个,python支持不少种地址家族,可是因为咱们只关心网络编程,因此大部分时候咱们只使用AF_INET)
socket在内的5层通讯流程python
TCP和UDP下socket差别对比图程序员
import socket server = socket.socket() server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) ip_port = ('127.0.0.1',8080) server.bind(ip_port) server.listen(3) while 1: conn,addr = server.accept() # 在这里阻塞,等待客户端过来链接 while 1: from_client_msg = conn.recv(1024) # 接收消息,在这里仍是阻塞,等待接受消息 print('来自大海的消息:',from_client_msg.decode('utf-8')) if from_client_msg.decode('utf-8') == 'bye': # 若是接收到的消息为bye,退出 break to_client_msg = input('星空:') # 服务端发出消息 conn.send(to_client_msg.encode('utf-8')) conn.close()
import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while 1: to_server_msg = input('大海说:') client.send(to_server_msg.encode('utf-8')) if to_server_msg == 'bye': break from_server_msg = client.recv(1024) print('来自星空的消息:',from_server_msg.decode('utf-8'))
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8090) udp_server.bind(ip_port) from_client_msg,client_addr = udp_server.recvfrom(1024) udp_server.sendto(b'sha',client_addr) print(from_client_msg,client_addr)
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8090) udp_client.sendto(b'hello',ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print(from_server_msg,server_addr)
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8010) udp_server.bind(ip_port) while 1: from_client_msg,client_addr = udp_server.recvfrom(1024) print(from_client_msg.decode('utf-8'),client_addr) to_client_msg = input('服务器说:') udp_server.sendto(to_client_msg.encode('utf-8'),client_addr) udf_server.close()
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8010) while 1: to_server_msg = input('客户端说:') udp_client.sendto(to_server_msg.encode('utf-8'),ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print(from_server_msg.decode('utf-8'),server_addr) udp_client.close()