1、TCP与UDP?
1.1、概述
传输控制协议(TCP)是一个比较复杂的协议。主要特点如下:
(1)TCP是面向连接的运输层协议。也就是说,在使用TCP协议之前,需要建立TCP连接,当传输数据完毕,必须释放已经建立的TCP连接。
(2)每一条TCP连接只能是点对点的。
(3)TCP协议是可靠交付的服务。通过TCP连接传输的数据,无差错,不丢失,不重复,并且按顺序到达。
(4)TCP提供全双工通信。允许双方进程在任何时候都能发送数据,TCP连接的两端都设置有发送缓存和接受缓存。
(5)面向字节流。面向字节流含义:虽然应用与TCP的交互是一次一块数据块,但TCP把交互下来的数据仅仅看成一连串的无结构字节流,不知道字节流的含义。
(6)TCP不关心应用进程一次把多长的报文发送到TCP缓存,而是根据对方给出的窗口值和当前网络拥塞程度来解决定一个报文段包含多少个字节,UDP发送的报文长度是应用进程给的。
1.2、报文结构
TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据需要而添加的字段。
1.3、TCP的3次握手与4次挥手
1、三次握手:建立一个TCP连接时,客户端与用户端之间共发送3个数据包。
在打算建立TCP连接时,客服端向服务器端发送连接请求报文段,这时首部中的同步位SYN=1,同时选择一个而出是序列号seq = x,此时已变成同步已发送状态。
当服务器端收到请求报文段时,如同意连接,则向客户端发送确认,在确认报文段中SYN =1,ACK=1,确认号是ack=x+1,同时也为自己发送一个初始序列号seq=y,此时进入同步已收到状态。
当客户端收到服务器端确认报文后,还要向服务器端发送确认报文,SYN=1,ACK=1,确认信号为ack=y+1,初始序列号为seq=x+1,,进入已连接状态。
关于最后为什么客户端还要向服务器端发送确认信息?原因:为了防止已经失效的连接请求报文段突然又传到服务器端。
2、四次挥手:
第一次挥手:客户端发送连接释放报文段,首段的终止控制符FIN=1,序列号seq=u,并停止发送数据,进行主动关闭请求。
第二次挥手:服务器端收到连接释放报文段即发出确认,确认号为ack=u+1,而发送自己的报文段序号为v。此时TCP服务器进程通知高层的应用层进程,客户端到服务器端的连接就释放了,这时候处于变关闭状态。若服务器端向客户端发送数据,客户端还是会接收,也就是从服务器端到客户端的的连接并未断开。
第三次挥手:若服务器端没有数据发送给客户端,则关闭服务器到客户端的连接。
第四次挥手:客户端收到释放连接报文 ,必须对此发出确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL后,才进入到CLOSE状态。
3、为什么需要2MSL时间?
(1)保证客户端发送过去的最后一个ACK被接收到。
(2)为了保证已经失效的连接请求报文段出现在本连接中。
1.4、TCP可靠性是如何保证?
原理:在TCP连接中 ,数据流必须以正确的顺序送达到对方。TCP的可靠性是通过顺序号和确认来实现的。
实现:
(1)超时重传
(2)流量控制:让发送方的发送速率不要太快,要接收方来得及接收
(3)拥塞控制:防止过多的数据注入网络中,这样可以使网络中的路由器或者链路不过载。方法如下:
(1)慢开始:从小到大逐渐增大拥塞窗口数值,成倍增大。
(2)拥塞避免:让拥塞窗口cwnd缓慢增大,按线性规律缓慢增长。
(3)快重传:
(4)快恢复:
1.5、UDP概述
UDP特点:
(1)UDP是无连接的
(2)UDP使用尽最大努力交付
(3)UDP是面向报文的
(4)UDP没有拥塞控制
(5)支持一对一,一对多,多对一,多对多
(6)首部开销小
1.6、TCP和UDP区别
特点 | TCP | UDP |
连接性 | 面向连接 | 无连接 |
可靠性 | 可靠(无差错、不丢失、不重复、且按照顺序到达) | 不可靠(尽最大努力交付) |
传输效率 | 慢 | 快 |
2、地址的分类
A类地址:以0开头,第一个字节范围:0~127
B类地址:以10开头,第一个字节范围:128~191
C类地址:以110开头,第一个字节范围:192~223
D类地址:以1110开头,第一个字节范围:224~239
特殊地址:1、全0对应当前主机 2、全1当前子网的广播地址 3、以“1110”开头的用来实验 4、127.0.0.1~127.255.255.255用于回路测试
3、超文本传输协议HTTP和安全套接字层超文本传输协议HTTPS
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTP和HTTPS的区别:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安 全。
4、浏览器输入地址后发生的全过程
1、进行域名解析,将域名转换成对应的IP地址
(1)域名解析
(2)查找浏览器缓存—>系统缓存->路由器缓存->DNS缓存->搜索(从上级域名往下搜索)
2、浏览器发起TCP连接,向该IP服务器端发送一个HTTP请求
3、服务器端向浏览器端发送一个永久重定向响应
4、浏览器根据重定向再发送一个HTTP请求
5、服务器端分析HTTP请求,生成HTTP响应,将响应返回给浏览器
6、浏览器收到响应后,生成主页框架,同时继续发送请求,请求的内容为主页的资源
7、静态的主页内容通常进行缓存,动态的主页内容不缓存,缓存的话时间也是有限
8、浏览器继续发送异步请求,因为有些页面显示完成之后客户端仍需要与服务端保持联系。
9、整个过程结束,浏览器关闭TCP连接
5、OSI七层模型
OSI中的层 | 功能 | 协议 |
应用层 | 文件传输,电子邮件,文件服务 | TFTP,HTTP,SNMP |
表示层 | 数据格式化,代码转换,数据加密 | |
会化层 | 解除或者建立别的连接点 | |
传输层 | 提供端到端的接口 | TCP,UDP |
网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,ARP,RARP |
数据链路层 | 传输有地址的帧以及错误检验 | PPP |
物理层 | 以二进制的形式在物理媒介上传输数据 | ISO2110,IEEE802 |
ARP协议(地址解析协议):从网络层使用的IP地址解析出数据链路层使用的硬件地址。每台主机都有一个ARP表,以表示IP地址和MAC地址的对应关系。当源主机发送一个数据包过来,会首先检查自身的ARP列表是否存在该IP地址对应的MAC地址,如果有,直接发送数据包到该MAC地址,如果没有,在本网段发起一个ARP请求的广播包,查询此IP对应的MAC地址。
ICMP协议(网际控制报文协议):目的:为了有效转发IP数据报和提高交付成功的机会,在网际层使用了ICMP协议。
路由选择协议:
(1)内部网管协议(RIP路由信息协议):一种分布式的基于距离向量的路由选择协议。RIP要求每一个路由都要维护从它自己到其他每一个 目的网络的距离。一次只给一个相邻的路由器转发。
距离向量算法,实际中较少使用。
- 默认,RIP使用简单的度量:通往目的站点所需经过的链路数。取值为1~15,数值16表示无穷大。
- 使用UDP的520端口发送和接收RIP分组。
- RIP 每隔30秒以广播形式发送一次路由信息,在邻居之间互传。
- 防止广播风暴:后续分组做随机延时后发送。
- 如果一个路由在180s内未被更新,相应的距离设置为无穷大:16,并从路由表中删除该表项。
- RIP分组分为:
- 请求分组
- 响应分组
(2)内部网关协议(OSPF开放最短路径协议): OSPF是一种链路状态路由协议,即采用OSFP协议的路由器均知道它所属于的区域内的所有接口和链路的状态信息。一次更新所有相邻的路由
NAT协议(网络地址池转换协议):属于介入广域网技术,是一种将私有地址转换成合法IP地址的技术,它被广泛应用于各种类型Internet接入方式和方式类型的网络中。
DHCP协议(动态主机设置协议):是一个局域网协议,使用UDP协议工作,给局部网络或者网络服务供应商自动分配IP地址。
DNS协议(域名解析协议):
6、TCP粘包和拆包怎么处理?
TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议。那么UDP是否会发生粘包或拆包的现象呢?答案是不会。UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;另外从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。
粘包:
拆包:
粘包、拆包发生原因
发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充,
1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
粘包、拆包解决办法
通过以上分析,我们清楚了粘包或拆包发生的原因,那么如何解决这个问题呢?解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下几个:
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。