网络基础tcp
问题:网络到底是什么?计算机之间是如何通信的?
早期 : 联机
以太网 : 局域网与交换机
广播
主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
ip地址与ip协议
- 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
- 范围0.0.0.0-255.255.255.255
- 一个ip地址通常写成四段十进制数,例:172.16.10.1
- 总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
-
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
-
端口:是英文port的意译,可以认为是设备与外界通讯交流的出口
mac地址
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
arp协议 ——查询IP地址和MAC地址的对应关系
广域网与路由器
路由器
局域网
局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。
子网掩码
所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中(属于同一个网段),否则就不是。
例如
比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算, 172.16.10.1:10101100.00010000.00001010.000000001 255255.255.255.0:11111111.11111111.11111111.00000000 AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0 172.16.10.2:10101100.00010000.00001010.000000010 255255.255.255.0:11111111.11111111.11111111.00000000 AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0 结果都是172.16.10.0,因此它们在同一个子网络。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
tcp协议和udp协议
用于应用程序之间的通信。如果说ip地址和mac地址帮我们确定唯一的一台机器,那么我们怎么找到一台机器上的一个软件呢?
端口
我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
TCP协议
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
tcp三次握手
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四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由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]
UDP协议
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
tcp和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协议了。
互联网协议与osi模型
引子
须知一个完整的计算机系统是由硬件、操作系统、应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己玩了(打个单机游戏,玩个扫雷啥的)
如果你要跟别人一起玩,那你就需要上网了,什么是互联网?
互联网的核心就是由一堆协议组成,协议就是标准,比如全世界人通信的标准是英语,如果把计算机比作人,互联网协议就是计算机界的英语。所有的计算机都学会了互联网协议,那所有的计算机都就可以按照统一的标准去收发信息从而完成通信了。
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
每层运行常见物理设备
每层运行常见的协议
服务器和客户端进行交互(tcp)
简单建立一个连接
服务器 import socket # type=SOCK_STREAM # 流 tcp协议的关键字 # 实例化一个socket对象:套接字 sk=socket.socket() # 不传参,默认使用默认参数,默认tcp协议 #'127.12.68.88':回环地址,本机默认地址,可以做小幅度变动 sk.bind(('127.12.68.88',8086)) # 开启服务 8086端口,我们能用的是8000-65535,前面是固定的,不能用 sk.listen(10) # 监听,允许多少个客户端来链接我 fd,addr=sk.accept() # 等待接收客户端链接 fd.close() sk.close() 客户端 import socket sk = socket.socket() sk.connect(('127.12.68.88', 8086)) # 收发信息的逻辑 暂时没写 sk.close() # 连接上就断开,为了验证服务器端accept阻塞的功能 可以打印出234
验证服务器端accept阻塞的功能
服务器 import socket sk=socket.socket() # 我买了一个新手机 sk.bind(('127.12.68.88', 8086)) # 买一个电话卡,装上 sk.listen(10) # 告诉几个人我的手机号 print(123) # 代码会输出123,但不会输出234,代表代码运行停在了accept这里 fd,addr=sk.accept() # 等着别人给自己打电话,阻塞等待客户端来链接 print(234) fd.close() # 挂断电话 sk.close() # 关机 客户端 import socket sk = socket.socket() sk.connect(('127.12.68.88', 8086)) # 收发信息的逻辑 暂时没写 sk.close() # 连接上就断开,为了验证服务器端accept阻塞的功能 可以打印出234
简单的收发,传输过程中是Bytes类型数据
服务端 import socket sk=socket.socket() sk.bind(('127.12.68.88', 8086)) sk.listen(10) fd,addr=sk.accept() msg_r=fd.recv(1024).decode('utf-8') # 接收的是bytes类型,需要解码 print(msg_r) # 测试阶段使用 fd.close() sk.close() 客户端 import socket sk=socket.socket() sk.connect(('127.12.68.88', 8086)) # 收发信息的逻辑 sk.send(b'hello') # 收发的都是bytes 类型,可以选择转码encode,也可以直接发bytes类型 sk.close()
连续收发逻辑,但是此时没有断开连接逻辑
服务器 import socket sk=socket.socket() sk.bind(('127.12.68.88', 8086)) sk.listen(10) fd,addr=sk.accept() while 1: msg_r=fd.recv(1024).decode('utf-8') print(msg_r) msg_s=input('>>>') fd.send(msg_s.encode('utf-8')) fd.close() # 前面是死循环,这句话会标黄 sk.close() 客户端 import socket sk=socket.socket() sk.connect(('127.12.68.88', 8086)) #收发信息逻辑 while 1: msg_s=input('>>>') if msg_s=='q': break sk.send(msg_s.encode('utf-8')) msg_r=sk.recv(1024) print(msg_r.decode('utf-8')) sk.close()
连续收发逻辑+断开连接
服务器 import socket sk = socket.socket() sk.bind(('127.68.66.12', 8086)) # ('127.68.66.12', 8086)以元祖的形式传进去 sk.listen(10) fd, addr = sk.accept() # fd文件句柄 while 1: msg_r = fd.recv(1024).decode('utf-8') if msg_r=='q': break print(msg_r) msg_s = input('>>>') fd.send(msg_s.encode('utf-8')) if msg_s=='q': break fd.close() sk.close() 客户端 进行简单循环收发,有退出功能,针对服务器5 要求 客主户主动发送一个q,断开连接,并且服务器也断开连接 服务器主动发送q,断开连接,并且此时客户也要断开 import socket sk = socket.socket() sk.connect(('127.68.66.12', 8086)) while 1: msg_s = input('>>>') sk.send(msg_s.encode('utf-8')) if msg_s == 'q': break msg_r = sk.recv(1024).decode('utf-8') if msg_r == 'q': break print(msg_r) sk.close()
1.你知道哪些研发相关的架构?
C/S架构(鼻祖) C:client 客户端 S:server 服务器 B/S 架构(隶属于c/s架构) b:brower 浏览器 统一了应用的端口 s:serve 服务器 B/S架构的优点,统一了应用的端口(是一种趋势)
2.arp协议做了什么事情?
arp协议 ——查询IP地址和MAC地址的对应关系 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。 主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址。 收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。 地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,
其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,
使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、
添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议
3.交换机的通讯方式?
4.你认为tcp和udp的区别?
tcp和udp协议都是基于socket模块 tcp:安全可靠,面向连接,字节流服务--代表没有边界 udp:不安全可靠,不面向连接,但是效率高
5.描述出osi五层模型?
应用层 表示层 应用层------>应用层------>py文件--------------> 会话层 传输层------>传输层------>tcp/udp-----------------> 传输层 网络层------>网络层------>ip---------------------> 网络层 网络接口层--->数据连接层----->arp/mac------------> 数据连接层 物理层------>网线,电信号,hub集成器------> 物理层
6.网段ip怎么确定?
网段:ip地址 &(与) 子网掩码
ip:192.168.12.66 子网掩码:255.255.255.0
11000000.10101000.00001100.01000010
11111111.11111111.11111111.00000000
------------------------------------
11000000.10101000.00001100.00000000
192.168.12.0 同一个交换机下连接的电脑,网段总是相同的
7.请描述B/S架构的优势?
统一了应用的接口
知识梳理
1.架构
C/S架构(鼻祖)
C:client 客户端
S:server 服务器
B/S 架构(隶属于c/s架构)
b:brower 浏览器 统一了应用的端口
s:serve 服务器
B/S架构的优点,统一了应用的端口(是一种趋势)
2.同一电脑上两个py文件通信:文件
网卡:网卡生产厂商生产的,不是电脑厂商生产的
网卡上有一个mac地址,又叫做物理地址,全世界唯一,查看mac地址命令:ipconfig -all
窗口键+r 进入到电脑的终端,输入ipconfig -all,查看mac地址,在以太网里面找
3.两台电脑如何通信:一根网线
4.几十台电脑如何通信:局域网
交换机通讯:
广播:吼一嗓子
单播:方向固定的向某一主机发送
组播:朝着某一部分或者某一组主机发送
ip地址:是一个四位点分十进制的一串数字
子网掩码:是计算机根据你的ip地址生产的一个东西
网段:ip地址 &(与) 子网掩码
ip:192.168.12.66 子网掩码:255.255.255.0
11000000.10101000.00001100.01000010
11111111.11111111.11111111.00000000
------------------------------------
11000000.10101000.00001100.00000000
192.168.12.0 同一个交换机下连接的电脑,网段总是相同的
5.更多电脑之间的通信:
广域网 交换机+路由器+代理ip
6.库==模块:别人写好的代码,我们可以直接拿来用
tcp和udp协议都是基于socket模块
tcp:安全可靠,面向连接,字节流服务--代表没有边界
udp:不安全可靠,不面向连接,但是效率高
7.端口号:
ip+prot(端口) 唯一确定一台主机上的某一个程序
允许开发人员使用的端口号范围从8000-10000
8. tcp协议的三次握手过程:
客户端先发:我想请求连接
服务器发:同意,我也想连接你
客户端发:同意连接
9. tcp协议的四次挥手过程
客户端发:我想断开连接
服务器:行
服务器:我也想和你断开连接
客户端发:行
10.路由器:有一个路由表,用来记录网段信息
11.网段怎么得到?
ip地址 按位与 子网掩码(1,0得0,1,1得1)