一、TCP和UDP的区别
- TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
- UDP数据传输快,但安全性却一般
- TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报
- TCP对应的协议和UDP对应的协议不同
TCP对应的协议:
- FTP:定义了文件传输协议,使用21端口
- Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务
- SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口
- POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口
- HTTP:是从Web服务器传输超文本到本地浏览器的传送协议
UDP对应的协议:
- DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口
- SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
- TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务
二、TCP、UDP报头格式
2.1 TCP报头格式
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- URG:紧急指针(urgent pointer)有效
- ACK:确认序号有效
- PSH:接收方应该尽快将这个报文交给应用层
- RST:重置连接
- SYN:发起一个新连接
- FIN:释放一个连接
2.2 UDP报头格式
三、TCP三次握手和四次挥手的全过程
3.1、三次握手:
- 第一次握手:客户端发送请求报文标志位SYN=1和确认号seq=x到服务器,并进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到客户端请求报文后,如果同意连接,则发出确认报文,ACK=1,SYN=1,确认号是Ack=x+1,同时也要为自己初始化一个序号 seq=y,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器确认报文后,需向服务器发送确认报文,标志位ACK=1,确认号Ack=y+1,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
1)SYN攻击:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:#netstat -nap | grep SYN_RECV
2)TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?
假设主机A为客户端,主机B为服务器端。采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费
3)如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
3.2、四次挥手
- 第一次挥手:Client发送释放连接报文FIN=1,seq=u(u是客户端最后一次序号加1)到Server,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到Client释放报文后,发送确认报文ACK=1,确认号ack=u+1,同时初始序号seq=v给Client,Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发出释放连接报文FIN=1,ACK=1,ack=u+1,seq=w给Client,Server进入LAST_ACK状态。
- 第四次挥手:Client收到服务器释放连接报文后,Client进入TIME_WAIT状态,接着发送确认报文ACK=1,seq=u+1,ack=w+1给Server,Server进入CLOSED状态,完成四次挥手。
1)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,己方ACK和FIN是分开发送的。可能原因是服务器可能还在发送数据给客户端,没有关闭数据接口的意思,所以先发ACK确认报文,随后才发了FIN,表示不再发送数据。(发送FIN,表示不再发送数据,但是可以接受数据)
2) 为什么客户端最后还要等待2MSL(最长报文段寿命)?
- 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失
- 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文
四、TCP长连接和短链接
长连接:指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。
短链接:短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。
在HTTP/1.0中,默认使用的是短连接。从 HTTP/1.1起,默认使用长连接,会在响应头有加入这行代码Connection:keep-alive,Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况下。HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接
五、TCP/IP如何实现数据可靠传输的
TCP/IP可靠传输的基础是滑动窗口协议和连续ARQ协议,配合着流量控制和拥塞控制,使得整个传输过程保证:
- 传输信道不产生差错
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据(通过累计确认、超时重传、拥塞控制三大模块保证)
详情访问https://blog.csdn.net/qq_33314107/article/details/81607630
六、Http和Https区别
- http是超文本传输协议,信息是明文传输,HTTPS协议是由SSL+HTTP协议组成,比http协议安全
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- 端口不一样,前者是80,后者是443
七、Http请求
- 首先,与服务器的HTTP端口(默认为80)建立一个TCP套接字连接
- 通过TCP套接字,客户端向Web服务器发送一个请求报文(一个请求报文由请求行、请求头部、空行和请求数据4部分组成)
- 服务器解析请求,定位请求资源。服务器将资源写到TCP套接字,由客户端读取(一个响应由状态行、响应头部、空行和响应数据4部分组成)
- 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
- 客户端浏览器解析服务器响应内容
八、HTTPS请求过程
- 客户端发送请求到服务器端
- 服务器端返回证书(包括公开密钥)给客户端
- 客户端验证证书有效性,如果有效,则生成共享密钥并使用公钥加密数据发送到服务器端
- 服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
- 客户端使用共享密钥解密数据
九、HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
十、GET和POST请求的区别
- GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;POST提交:把提交的数据放置在是HTTP包的包体中。
- 安全性:POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成CSRF(Cross-site request forgery)跨站请求伪造攻击(防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。)
- 传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置
十一、Session和Cookie机制
HTTP协议本身是无状态的,本身并不能支持服务端保存客户端的状态信息,引入了session和cookie概念。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
11.1 Cookie机制:
- Cookie的不可跨域名性
- 中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码
Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setDomain(".helloweenvsfei.com"); // 设置域名
cookie.setPath("/"); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
response.addCookie(cookie); // 输出到客户端
11.2 Session机制:
1)Session的工作原理:
1、当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;
2、这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。对于session标识号(JSESSIONID),有两种方式实现:cookies和URL重写。
2)Session周期:
Session创建:Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
Session失效:1.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。 2. 调用Session的invalidate方法
十二、DNS解析过程
- 在浏览器中输入www.qq.com域名,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)。
- 当浏览器缓存中无域名对应IP时操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
- 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机
十三、TCP/IP 四层模型和 OSI 七层模型
OSI七层模型 | TCP/IP 四层模型 | 网络协议 |
应用层 (Application) | 应用层 | HTTP(超文本传输协议) HTTPS(超文本传输安全协议) FTP(文件传输协议) SMTP(简单邮件传输协议) DNS(域名服务) 等等 |
表示层 (Presentation) | ||
会话层 (Session) | ||
传输层 (Transport) | 传输层 | TCP(传输控制协议) UDP(用户数据报协议) |
网络层 (Network) | 网际互连层 | IP(网际协议) ICMP(网络控制消息协议) IGMP(网络组管理协议) |
数据链路层 (Data Link) | 网络接口层 | 以太网 Wi-Fi 等等 |
物理层 (Physical) |
访问www.baidu.com的全过程:
- 客户端浏览器通过DNS解析到www.baidu.com 的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.181.27.48,然后通过TCP进行封装数据包,输入到网络层。
- 在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
- 客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
- 客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址
十四、IP地址的分类
- A类地址:以0开头, 第一个字节范围:1~126(1.0.0.0 - 126.255.255.255);
- B类地址:以10开头, 第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);
- C类地址:以110开头, 第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);
- D类地址:以1110开头,第一个字节范围:224~239(224.0.0.0 - 239.255.255.255);(作为多播使用)
- E类地址:保留
其中A、B、C是基本类,D、E类作为多播和保留使用。
以下是留用的内部私有地址:
- A类 10.0.0.0--10.255.255.255
- B类 172.16.0.0--172.31.255.255
- C类 192.168.0.0--192.168.255.255
IP地址(例:192.168.2.110)与子网掩码(例:255.255.255.0)相与得到网络号(例:192.168.2 .0)
十五、ARP(地址解析协议)工作原理
- 首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系
- 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址
- 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址
- 源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败
- 广播发送ARP请求,单播发送ARP响应
十六、RARP逆地址解析协议
作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络
十七、交换机和路由器的区别
- 工作层次不同:最初的的交换机是工作在OSI/RM开放体系结构的数据链路层,也就是第二层,而路由器一开始就设计工作在OSI模型的网络层。由于交换机工作在OSI的第二层(数据链路层),所以它的工作原理比较简单,而路由器工作在OSI的第三层(网络层),可以得到更多的协议信息,路由器可以做出更加智能的转发决策。
- 数据转发所依据的对象不同:交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用不同网络的ID号(即IP地址)来确定数据转发的地址。IP地址是在软件中实现的,描述的是设备所在的网络,有时这些第三层的地址也称为协议地址或者网络地址。MAC地址通常是硬件自带的,由网卡生产商来分配的,而且已经固化到了网卡中去,一般来说是不可更改的。而IP地址则通常由网络管理员或系统自动分配
- 传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域:由交换机连接的网段仍属于同一个广播域,广播数据包会在交换机连接的所有网段上传播,在某些情况下会导致通信拥挤和安全漏洞。连接到路由器上的网段会被分配成不同的广播域,广播数据不会穿过路由器。虽然第三层以上交换机具有VLAN功能,也可以分割广播域,但是各子广播域之间是不能通信交流的,它们之间的交流仍然需要路由器。
- 路由器提供了防火墙的服务:路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和未知目标网络数据包的传送,从而可以防止广播风暴。交换机一般用于LAN-LAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。路由器用于WAN-WAN之间的连接,可以解决异性网络之间转发分组,作用于网络层。他们只是从一条线路上接受输入分组,然后向另一条线路转发。这两条线路可能分属于不同的网络,并采用不同协议。相比较而言,路由器的功能较交换机要强大,但速度相对也慢,价格昂贵,第三层交换机既有交换机线速转发报文能力,又有路由器良好的控制功能,因此得以广泛应用
- 总之,可以这么认为,交换机在具体的城域网中往往扮演着VLAN透传的角色,就是桥。而路由器默认的是不支持二层的,路由器的每一个端口都是一个独立的广播域和冲突域,而交换机是只有一个广播域和端口数量的冲突域,在二层交换机上存在MAC表,三层交换机上存在路由表.MAC.ARP表,在路由器上存在路由表和arp表。比如当一个路由器上有一个2层的vlan100和另外一个路由器上的3层vlan100对接的时候,是不通的,这时候我们需要借助L2VPN技术来进行互通,比较流行的就是VPLS技术。