标签:视频 数据 三次 第一个 use chm pre 添加 通过
c/s架构:
? 客户端和服务器端
? c端—————网络—————s端
s端:
有固定的ip
稳定一直在运行,支出并发
网路:网络连接介质 + 网路协议(osi七层)
五层(七层)协议:应传网数物(应表会传网数物)
物理层(介质加信号):主要就是由二进制组成的 电信号传输介质,处于最底层
数据链路层(数据帧、mac、广播):主要就是把物理层的电信号进行分组,每一组叫一个数据报/数据帧,每一个数据帧分成,报头head和数据data两部分组成
每一个数据报,都是由报头和数据部分
广播:同一个局域网内通信,会出现广播风暴(简单来讲就是由于广播数据太多,占用大量的网络带宽,导致正常业务不能运行,甚至瘫痪的现象)
网络层(ip):
传输层(tcp/udp):
tcp协议;
"""
序列号seq: 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号
确认ACK:占1位,仅当ACK=1时,确认号字段才有效,ACK=0时,确认号无效
PS:ACK,SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack,seq小写的单词表示序号
"""
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1), 同时自己也发送一个SYN包(syn=k), 即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器端的SYN+ACK包,向服务器发送确认包ACK(ack=k+1), 此包发送完毕,客户端和服务器进入ESTABLISGED(TCP链接成功)状态,完成三次握手
1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加一),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2.服务器收到连接释放报文,发出确认报文,ACK=1, ack=u+1, 并且带上自己的序列号seq=v, 此时,服务器就进入了CLOSE-Wait(关闭等待)状态,TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受
3.客户端收到服务器的确认请求后,此时客户端就进入了FIN-WAIT-2(终止等待)状态,等待服务发送连接释放报文(在此之前还需要接受服务器发送的最后的数据)。
4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
**5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1, 而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,猜进入CLOSE状态**
6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态,同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些
服务端如果看到大量的syn_rcvd状态,表明收到了dos和ddos攻击:拒绝服务攻击和分布式的拒绝服务攻击
端口号:端口范围0-65535,0-1023为系统占用端口
发送,不需要对方响应,所以数据不可靠(看视频就是基于这种协议进行的,卡顿,马赛克就是数据丢失)
应用层 HTTP、DNS(待补充)
上网流程分析:
? 在浏览器输入www.baidu.com,会取dns服务器通过域名解析成ip地址,向ip+端口号这个地址发送请求,就会访问到百度的服务器
socket:在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,用来实现进程在网络中通信
#Server.py
#导入一个socket模块
import socket:
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind('192.168.11.191', 8080)#写本机ip,局域网外部可以访问
#soc.bind('127.0.0.1', 8080) #如果写这个ip,只能自己访问
soc.listen(5)
conn,addr = soc.accept()
data = conn.recv(1024)
conn.send(b'xxxx')
conn.close()
soc.close()
#CLient.py
import socket
soc=socket.socket()
soc.connect(('192.168.11.146', 8080))
soc.send(b'xxxx')
data=soc.recv(1024)
soc.close()
图片来源 https://blog.csdn.net/qq_38950316/article/details/81087809,侵删
标签:视频 数据 三次 第一个 use chm pre 添加 通过
原文地址:https://www.cnblogs.com/michealjy/p/11470440.html