1.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)安全外壳协议
  • SSL: 安全套接字层协议;
  • ELNET 远程登录协议
  • 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)网络校时

    表示层

    HTTP/HTML · FTP · Telnet · ASN.1(具有表示层功能)

    会话层

    ADSP ·ASP ·H.245·ISO-SP ·iSNS ·NetBIOS ·PAP ·RPC·
    RTCP ·SMPP ·SCP ·SSH ·ZIP ·SDP(具有会话层功能)

    传输层

  • 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) · 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 · ISDN ·STP

    物理层

    以太网路卡 · 调制解调器 · 电力线通信(PLC) · SONET/SDH(光同步数字传输网) ·
    G.709(光传输网络) · 光导纤维 · 同轴电缆 · 双绞线
    网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(**ip地址,协议,端口**)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。(PS:一个端口只能被一个进程及其子进程占用,所以 ip+ 端口就可以判断)

    2.TCP UDP 传输层

    | 传输层协议 | 应用 | 应用层协议 | | —- | —- | —- | | TCP | 电子邮件 | SMTP | | | 终端连接 | TELNET | | | 终端连接 | SSH | | | 万维网 | HTTP | | | 文件传输 | FTP | | UDP | 域名解析 | DNS | | | 简单文件传输 | TFTP | | | 网络时间校对 | NTP | | | 网络文件系统 | NFS | | | 路由选择 | RIP | | | IP电话 | - | | | 流式多媒体通信 | |

3.SOKECT 编程

3.1什么是Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
PS:描述符就类似于Java中的引用变量,而操作系统中的C语言并没有面向对象,没有引用变量和对象之说,因此需要用描述符来指向之前创建的Socket数据结构,来操纵它完成网络操作。
image.png

3.2 socket的基本操作

常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

3.2.1 socket()函数

int socket(int domain, int type, int protocol);

3.2.2 bind() 函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

3.2.3 listen() 函数listen()、connect()函数

正如上面所说bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。
int listen(int sockfd, int backlog);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。
connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

3.2.4 accept()函数

TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

3.5、read()、write()等函数

万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:
read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()

4.HTTP 超文本传输协议

2.1 http vs https

HTTPS协议需要到CA申请证书(包含机构,服务器公钥),一般免费证书很少,需要交费。
SSL/TLS构建的是一个加密通道,和上层应用协议无关,HTTP over TLS = HTTPS。
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS基于TCP之上,所有传输的内容都经过加密的。
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http2 新特性:

  • 新的二进制格式(Binary Format)
  • 多路复用(MultiPlexing)
  • header压缩
  • 服务端推送(server push)

Restfull规范

methods CRUD 幂等 缓存
GET Read
POST Create
PUT Update/Replace
PATCH Update/Modify
DELETE Delete

5. RPC

3.1 Thrift
3.2 http -> gRPC
3.3 MQ 消息队列 (Message Queue)


TPS:Transactions Per Second(每秒传输的事物处理个数)
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 80% ) / ( 每天秒数 20% ) = 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
问:每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 0.8 ) / (86400 0.2 ) = 139 (QPS)
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3
顺便一提:
800Gbps=100G/s
因为一个字节等于8bit
Qps基本类似于Tps,但是不同的是,对于一个页面的一次访问,形成一个Tps;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“Qps”之中。
例如:访问一个页面会请求服务器3次,一次访问,产生一个“T”,产生3个“Q”

参考文档:
Socket通信原理
https://www.cnblogs.com/clschao/articles/9613442.html ip协议
https://blog.csdn.net/qq_29344757/article/details/78585296
https://blog.csdn.net/iamlate/article/details/6682920 p2p 协议
https://cloud.tencent.com/developer/article/1005974 coneNat 协议
https://www.cnblogs.com/wj-1314/p/7588252.html tcp/ip 协议
https://segmentfault.com/a/1190000020610336 http 三次握手