网络协议总结

网络拓扑图 大致分为5层

应用层 : HTTP HTTPS

传输层 : TCP UDP 将由网络层传来的数据包确认身份并传输给应用层。

            UDP只是在IP数据包上增加端口等部分信息。是面向无连接的,是不可靠传输。容易掉帧

            TCP则是面向连接,所谓的面向连接就是一种端到端间通过失败重传机制建立的可靠传输协议,

网络层 : IP 根据IP定义网络地址,区分网段。子网内根据地址解析协议进行MAC寻址,子往外进行路由转发数据包,这个数据包就是IP数据包。

链路层 : IEEE 链路层是以字节为单位把0和1进行分组,定义数据帧。写入源和目标机器的物理地址、数据、校验位来传输数据。以下是以太网的帧协议

在这里插入图片描述

MAC地址 : 6个字节 = 48位 用16进制表示,可以用inconfig -a 命令可以查看到MAC地址 。前24位由管理机构统一分发,后24位由厂商自己分配。以此来保证全球唯一性。

物理层 : 就是一些硬件上的东西

总结:程序发送数据的时候先由应用层按既定的协议打包数据,然后又传输层加上双方的端口,由网络层加上双方的IP地址,再由链路层加上双发的MAC地址,并把数据拆成数据帧,经过各种路由和网关送达到目标机器。目标机器则通过相反的操作来解包。

IP

ip是面向无连接,无状态的协议,不能确保安全与稳定,MAC地址已经确保了电脑的唯一性之所以还要加上ip地址是为了能给每个地址机上一个大致的范围,即所谓的网段。以保证寻找地址的时候不会超时,类似于索引的作用

IP 报文分为报文头和报文数据,报文头由版本号,头长度,标识,标志,分段偏移,生存协议,目标IP地址,源IP地址,挂载协议标识等构成,

其中比较重要的是2个端口、挂载协议标识和生存时间(TTL) ,

TTL首先由源机器设置一个初始值,经过一天路由器则减1 。当字段为0时数据包被丢弃。并发送ICMP报文通知源主机。以防止源主机无休止的发送报文。

挂载协议标识表示包里放置的子数据包协议类型。如6代表TCP。17代表UDP

TCP
TCP连接。是一个面向连接的可靠传输协议,为了确保可靠性,不仅要对每一个字节进行编号确认,校验数据包的有效性,在出现超时的情况下进行重传。还要实现滑动窗口和拥塞控制,避免因为网络的情况而影响到传输。每个TCP数据包是封装在IP包里的,每一个IP头的后面紧接着的就是TCP头

    TCP报头主要由目标端口号,源端口号,序列号,确认序列号等组成。

    2个端口号加上2个IP的地址就能标识一个唯一的TCP连接。因为TCP是面向连接的,所以要分成服务端和客户端

    TCP有一个FLAG位由6个bit构成。分别代表ACK,SYN,FIN,URG,PSH,RST.。都以1代表有效。其中SYN代表建立连接的同步信号。ACK代表用于对收到的数据进行确认。FIN标识后面没有数据需要发送,意味着连接将要关闭

    TCP的握手

   第一次握手  : 客户端向服务端发出一个数据包,并将SYN置位1,标识希望建立连接,并假设设置序列号为X

    第二次握手 : 服务端收到客户端的数据包,并通过SYN得知这是一个建立连接的请求,于是发送了一个响应包并将SYN设置为1,ACK为1表示已经接受到了客户端的连接请求。并必须把确认序列号为X+1。表示收到的是序列号为X的请求。

    第三次握手 : 客户端收到服务端的确认数据,校验收到的确认序列号好X+1, ACK为1 则建立这次tcp连接


能够建立多少个TCP 连接由服务器的文件描述符(fd) 来决定  通过命令 lsof -n | awk '{print $2}' | sort|uniq -c |sort -nr|more  查看各个进程的句柄数。除了TCP连接被抽象出fd来表示,UDP的数据报也是通过fd来表示


    TCP的松手     A为客户端  B为服务端

    第一次松手: A发起断开连接请求,传递信号量为FIN的标识给到B端,此时A端进入状态为FIN_WAITE_1的状态

    第二次松手: B端接受到A端发送的标识,并同意断开连接,发送ACK标识,表示同意断开连接,但是要等到B端处理完数据,然后由B端主动发起断开连接的请求,即发送信号量为FIN的标识给A端。   此时A端进入状态为FIN_WAITE_2,B端进入为CLOSE_WAITE状态

    第三次松手:B端处理完数据后主动发送信号量为FIN的标识给到A端,并且ACK为1,ack为A端发送断开连接时发送的seq+1用来标识是针对断开连接请求的反应。B端则进入LAST_ACK状态。此时A端接受到B端的请求,并作出ACK响应,之后就会进入TIME_WAIT状态,在这段时间要是A端没有收到B端的传输的数据,那么就确认可以断开连接了,这时A端就进入CLOSED状态。

第四次松手:B端收到A端发送的同意断开连接的请求就直接进入CLOSED状态

PS:为什么要有CLOSE_WAITE状态

    假设B端没有收到A端发送的第四次挥手,那么B端就会再次的发送一个FIN+ACK的挥手给到A端,然后A端在重新发起第四次挥手。如果A端没有CLOSE_WAITE状态,直接进入CLOSE状态那么这种情况则会导致B端不能进入CLOSE状态。

time_wait时间不宜设置的过长这样会导致服务器端性能不好,修改的地方在/ect/sysctl.conf里面的net.ipv4.tcp_fin_timeout=30该属性,单位是秒 。修改完执行/sbin/sysctl -p让参数生效。通过netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a ,S[a]}’ 查看tcp连接各个状态的数量

查看某个端口的close_wait多少个 netstat -ant| grep -I “443” | grep CLOSE_WAIT | wc -l 查看443端口的close_wait状态的个数
http

请求部分 一个request分为

1.请求头

一些配置 如

Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/,/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
2.请求行

请求方法 请求数据源 协议

GET /562f25980001b1b106000338.jpg HTTP/1.1

3.请求数据

4.空行

响应部分 一个response也可以分为四个部分

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。

空行后面的html部分为响应正文。

解决https一些服务器的证书问题和ssl加密协议的问题

自己通过创建 HttpURLConnection 来进行获得http的链接

java.net包里可以实现 通过调用java.net.url的 openConnection() 方法来获得链接 然后往里面塞入一些请求配置。然后通过url的getProtocol()来获得该链接
的协议 如果是https的协议首先吧connection强转成httpsUrlConnection,调用httpsUrlConnection.setSSLSocketFactory来自己定义一个ssl

httpsUrlConnection.setHostnameVerifier方法 里面传的对象要实现 javax.net.ssl.HostnameVerifier.HostnameVerifier的方法 验证host是否符合 可以自己实现直接返回true
这样就能避免一些证书和加密算法不合适的问题了

HTTP本质是无状态的,使用Cookies可以创建有状态的会话。

http首部

Trailer : 首部名称 挂载信息 如过期时间等 请求首部 TE 需要设置trailers来允许挂载字段。

HTTPS 协议

HTTPS的大致流程

 1. 浏览器向服务器发送请求,请求里面包含支持的加密算法,并随机携带一个随机数

 2.服务器收到请求,再从客户端支持的加密算法里选择了非对称加密,并把数字证书签名公钥,身份的信息发给客户端,同是也带了个随机数

 3. 浏览器收到请求,首先验证证书的有效性,用服务器的公钥发送一个握手信息   就是所谓的SSL握手

 4. 服务器用私钥解密后,使用之前的随机数生成一个对称加密的秘钥,以此作为一个加密信息并发送

 5. 后续所有的信息发送都是以对称加密的方式进行

HTTPS握手:

    1.客户端发送了一个Client Hello协议,该协议最重要的就是Cipher Suites字段,该字段中会告诉服务端客户端所支持的加密算法

    2.服务端收到客户端发送的Client Hello协议,会返回一系列的协议数据,并已一个没有数据内容的Server Hello Done作为结束,这些协议有

的是单独发送有的是合并发送的。

                1).   Server Hello协议  : 告知后续协议中用的TLS的版本。并分配一个会话ID(session id) 。还要确认后续的加密配套 (cipher suites)。比如说TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256就表示用的是使用非对称协议(RSA)进行对称协议(AES)密钥的加密,并使用对称协议进行信息的加密;  对称加密算法有 DES 3DES AES  非对称的有RSA 


                2).   Certificate协议   主要是用来传输服务端的证书内容


                3) .   Server Key Exchange  补充以上协议没有给出的信息。比如说公钥如果以上协议已经给出了则不需要


                4).  Certificate Request 这是一个可选项。 只有当服务端项验证客户端的证书时才会带上

                5). 最后已Server Hello Done 为结束 标识此次的Server Hello已经结束了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值