传输协议:

一个完整的计算机由硬件、操作系统、应用软件组成,具备者三个条件,一台计算机可以进行简单的单机游戏:扫雷等等,如果想要和别人一起玩,就需要上网了,甚麽是互联网?互联网的核心就是由一堆协议组成,协议就是标准,比如全世界通用的语言就是英语,大家都通过银行与来交流,互联网协议就是计算机界的英语。所有的计算机都学会了计算机界的英语,所有的计算机就会按照统一的标准来进行交流和交换信息了。传输协议主要是osi七层协议或者是osi五层协议。

osi五层协议

每层的作用以及用到的协议

| | |

| | |

C/S和B/S架构

1.硬件C/S架构(打印机)

2.软件C/S架构(互联网中处处是C/S架构,比如QQ):B/S架构也是C/S架构的一种,B/S是浏览器/服务器

  1. C/S架构的开发主要运用socket。
    C/S架构
    ​ C:client 客户端
    ​ S: sever 服务端

B/S 百度 淘宝 码云
B:browser 浏览器
S:sever 服务端
B/S 架构中的浏览器 也是浏览器,只有安装完成以后,才能用
B/S 是C/S架构中的一种
B/s更好,不用更新,不依赖环境(不依靠于是windows系统,lnuix系统),统一了所有web程序的入口(也就是浏览其他网站,只需要通过浏览器查看也行)
C/S架构:安全性 程序比较庞大的时候,要使用B/s架构

socket是什么?

网络编程是编写程序使两台联网的计算机能够通信。两台计算机怎样传递数据,首先需要建立物理连接,即使不熟悉网络编程的,传输原理不太清楚的情况下,可以通过socket编程来实现网络编程
socket原意是插座的意思,在计算机领域socket呗称为套接字,它是计算机之间进行通讯的一种形式和约定方式。通过socket这种约定方式,一台计算机可以接受其他计算机的数据,也可以向其他计算机发送数据。在日常生活中,我们把插头插到插座上是为了取电,而我们为了使得计算机之间可以机型传输数据,需要连接到互联网,而socket就是用来连接到互联网的工具。
socket的典型应用是web服务器和浏览器:浏览器获得用户输入的url,向服务器发送请求,服务器分析接收到的URL,将对应的网页但还给浏览器,浏览器在经过解析与渲染,就将文字、图片、视频等元素传递给用户。
socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
socket简练的说是:建立连接和传递数据,下图是一个完整的socket通信图

socket与file的区别:
file是指定某个文件进行打开和关闭
socket模块是针对服务器端和客户端 socket进行打开、读写和关闭

TCP协议和UDP协议

TCP协议 ·Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
特点:面向连接,可靠,速度慢,长度不受限,全双工,流式传输,主要用于文件传输,邮件,实时传输

( 打电话 比较可靠)面向连接,速度比较慢(比如打电话需要时间)

​ #两边衔接通,再通信

​ #占用一个连接

​ #挂掉电话之后就不能继续说话

​ 官方定义:首先建立连接,其次消息传递,最后断开连接

​ 建立连接的时候,三次握手

​ 断开连接的时候 四次挥手

​ TCP协议应用于文件的上传和下载,发邮件,网络云盘,扣扣远程协助

​ TCP数据连接的信息不受数据长度的限制(比如打电话可以打好长时间)

UDP协议 (User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
特点:无连接,面向数据报,不可靠,速度快,长度受限制,一对一,多对多,主要用于短消息类,在线观看视频

             发短信   (不可靠)面向数据报   速度快(比如发短信联系,可以进行群发)

​ #不管对方在不在线

​ #不沾连接

​ #随时可以收消息

​ UDP协议应用于即时通讯工具:扣扣,微信

​ Udp能够传递的数据信息有限(比如发短信信息时,多了就必须转文件)

基于TCP的套接字

TCP是基于连接之上的秒首先需要建立连接,必须线启动服务端,然后再启动客户端去连接服务端

#TCP sever服务器端
from socket import socket,AF_INET,SOCK_STREAM
sk=socket(AF_INET,SOCK_STREAM)
sk.bind(("127.0.0.1",9001))       #地址和端口,地址和端口要以元组的形式存在
sk.listen()                             # 开始监听链接,主要是看有没有请求链接
coon,addr=sk.accept()          #接受客户端连接
msg=coon.recv()                #接受对方发来的信息
print(msg)                          #打印出客户端发来的信息
coon.send(b'hello')            #向客户端回复信息
coon.close()                        #关闭客户端的套接字,表示不在于这个客户端进行联系
sk.close()                              #关闭服务器的套接字
#TCP  客户端
from socket import socket,AF_INET,SOCK_STREAM
sk=socket(AF_INET,SOCK_STREAM)
sk.connect(("127.0.0.1",9001))   #和服务端的ip地址和端口建立链接
sk.send(b"hello")                         #已经建立链接开始发送数据
msg=sk.recv(1024).decode("utf-8")    #这是在接受数据
sk.close()                                              #关闭客户端套接字,表示不在于服务端进行链接数据

我们也可以用一个简单的例子,来了解TCP协议的通讯

#TCP服务端
import socket
ip_port=('127.0.0.1',9000)  #电话卡
BUFSIZE=1024                #收发消息的尺寸
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
s.bind(ip_port) #手机插卡
s.listen(5)     #手机待机conn,addr=s.accept()            #手机接电话
# print(conn)
# print(addr)
print('接到来自%s的电话' %addr[0])msg=conn.recv(BUFSIZE)             #听消息,听话
print(msg,type(msg))conn.send(msg.upper())          #发消息,说话conn.close()                    #挂电话s.close()                       #手机关机服务端
TCP客户端
import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect_ex(ip_port)           #拨电话s.send('linhaifeng nb'.encode('utf-8'))         #发消息,说话(只能发送字节类型)feedback=s.recv(BUFSIZE)                           #收消息,听话
print(feedback.decode('utf-8'))s.close()                                       #挂电话客户端

TCP协议中的三次握手 #传输控制协议(Transmission Control Protocol)

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

第一次握手:主机A发送位码为 syn=1,随机产生seq number=1234567的数据包到服务器,主机B由syn=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。

三次握手的面试题:
1、三次握手是TCP协议建立连接的过程
2、由客户端发送有一个syn请求,服务端接受并发送(SYN/ACK),客户端收到(SYN/ACK)再回复一个确认(ACK)
3、在原生的socket代码中三次握手由accept和connect来完成

TCP协议的四次挥手:(即在关闭文件的时候需要经历四次挥手)四次挥手的流程图

四次挥手告别的原理(面试题):
中断连接端可以是Client端,也可以是Server端。
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

面试题:为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

面试题:为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文(segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文,而ip头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

面试题:如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

面试题:为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

python 中的socket模块——网络编程(一)相关推荐

  1. Python 标准库 —— socket(网络编程)

    1. 抓取 banner(banner-grabbing) import socket socket.setdefaulttimeout(2) s = socket.socket() s.connec ...

  2. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

  3. 网络爬虫day1:python中的request模块基本使用

    网络爬虫day1:python中的request模块基本使用 get和post的区别 python运行代码 请求头 get和post的区别 在互联网的世界中,有一个不经常提起但是经常使用的协议:TCP ...

  4. 什么是Python中的套接字编程?

    摘要:本文涵盖了有关使用Python进行套接字编程的所有领域.套接字可以帮助您建立这些连接,而Python无疑可以简化连接. 本文分享自华为云社区<从零开始学python | 什么是Python ...

  5. python中调用什么模块的什么函数来实现求实数平方根_python语言基础与应用答案...

    python语言基础与应用答案 python3不再区分整数和长整数,统一为()类型. python可以使用(____)函数打开文件,这个函数默认的打开模式为(____). a=[3]alist=[1, ...

  6. python的多线程和多进程网络编程

    二十八.python的多线程和多进程网络编程 线程和进程关系: 进程是具有独立功能的程序,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是cpu调度的基本单位,它是比进程更小的能独 ...

  7. python中的log模块笔记

    日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日志输出中添 ...

  8. python中的系统模块_python中一些获取系统信息的模块

    1.platform模块 python中,platform模块给我们提供了很多方法去获取操作系统的信息 如: import platform platform.platform() #获取操作系统名称 ...

  9. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue ...

最新文章

  1. Sqlserver中一直在用又经常被忽略的知识点一
  2. firebug中html显示为灰色的原因总结
  3. 经验分享:布线测试关键步骤有哪些 ?
  4. 石墨烯区块链(4)API
  5. Log4j配置文件以及配置方法
  6. oracle where order by,ORACLE SQL WHERE和ORDER BY
  7. 微服务集成——《微服务设计》读书笔记
  8. 解决百度 ueditor v1.4.3 编辑器上传图片失真的bug?
  9. 蓝卡攻略_FGO紫式部简评:蓝卡连发输出,稀有的群体强解耐性拐
  10. 通过JS改变框架的src
  11. 【独家】小程序初体验及它带来的龙卷风
  12. 当AI学会共情,港科大新研究赋予Chatbot同理心 | 一周AI最火论文
  13. stata中的psm语句
  14. Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
  15. 企业—habor docker镜像仓库的搭建
  16. 适合程序员的笔记本电脑
  17. 渝粤题库 陕西师范大学 《危机管理》作业
  18. 什么是空热量的食物?“空热量”的谬论
  19. 分享 29 款 Chrome 插件,总有一款适合你
  20. 西安前端开发工程师待遇|哎呦不错呦

热门文章

  1. WinForm中遇到Label要显示的内容太长,自动换行
  2. 英文Essay写作润色步骤分为哪些方面?
  3. 夽谷科技亮相2021华南(广州)智能装备大会及装备数字化展览会
  4. 马云对996的表态,会让他跌下神坛吗?
  5. Nginx配置IP白名单和黑名单
  6. word大纲级别始终为一级的解决方案
  7. java孤岛余生怎么砍树,《孤岛余生》游戏食物配方攻略
  8. 从内核源代码配置文件预測泛泰新品(A920 ?)
  9. 朗科发布首款固态硬盘 将引PC更新换代潮
  10. python的cmd5x.call用法_Frida用法详解【附用例】