一、TCP/UDP
1、什么是TCP/IP和UDP
TCP/IP即传输控制/网络协议,是面向连接的协议,发送数据前要先建立连接(发送方和接受方的成对的两个之间必须建立连接),TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。
UDP它是属于TCP/IP协议中的一种。是无连接协议,发送数据前不需要建立连接,是没有可靠性的协议。因为不需要建立连接所以在网络上以任何可能的路径传输,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
2、TCP与UDP区别
TCP是面向连接的协议,发送数据前要先建立连接,TCP提供可靠性的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。
UDP是无连接的协议,发送数据前不需要建立连接,是没有可靠性。
TCP通信类似于要打个电话,接通了,确认身份后,才开始进行通行。
UDP通信类似于学校广播,靠着广播播报直接进行通信。
TCP只支持点对点通信,UDP支持一对一,一对多,多对一,多对多。
TCP是面向字节流的,UDP是面向报文的;面向字节流是指发送数据时已字节为单位,一个数据包可以拆分成若干个组进行发送,而UDP一个报文只能一次发完。
TCP首部开销(20字节)比UDP首部开销(8字节)要大
UDP的主机不需要维持复杂的链接状态表。
3、TCP和UDP的应用场景
对默写实时性要求比较高的情况使用UDP,比如游戏,媒体通信,实时播报,即时出现传输错误也能容忍;其他大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不会出现丢失。
4、运行在TCP或UDP的应用层协议分析。
运行在TCP协议上的协议:
HTTP(Hypertext Transfer Protocol,超文本传输协议)主要用于普通浏览。
HTTPS(HTTP over SSL,安全超文本传输协议)HTTP协议的安全版本。
FTP(File Transfer Protocol,文件传输协议)用于文件传输。
POP3(Post Office Protocol vserion 3,邮局协议)收邮件用
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)用来发送电子邮件。
TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登录到网络。
SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登录。
运行在UDP协议上的协议:
BOOTP(Boot Protocol,启动协议)应用于无盘设备。
NTP(Network Time Protocol,网络时间协议)用于网络同步。
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)动态配置IP地址。
运行在TCP和UDP协议上
DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作
ECHO(Echo protocol,回绕协议),用于查错及测量应答时间(运行在TCP和UDP协议上)
SNMP(Simple Network Management protocol,简单网络管理协议)用于网络信息的收集和管理
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)动态配置IP地址。
ARP(Address Resolution Protocol,地址解析依稀)用于动态解析以太网硬件的地址。
5、什么是ARP协议
ARP协议完后才能了IP地址与物理地址的映射。每一个主机都设有一个ARP高速缓存,里面有所在的局域网上的各主机和路由器的IP地址到硬件地址的映射表。
...
6、什么是NAT(Network Address Translation,网络地址转换)
用于解决内网中的主机要和因特网上的主机通信。由NAT路由器将主机的本地IP地址转换为全球IP地址,分为静态转换(转换得到的全球IP地址固定不变)和动态NAT转换。
7、从输入地址到获得页面的过程
(1)浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存,搜索操作系统的DNS缓存,读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);
如果要查询的域名不在本地DNS服务器区域解析,但该服务器已缓存了此网络映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询。
(2)浏览器获得域名对应的IP地址后,浏览器向服务器请求建立链接,发起三次握手;
(3)TCP/IP链接建立后,浏览器向服务器发送HTTP请求;
(4)服务器接收到请求后,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果几相应的试图返回给浏览器
(5)浏览器解析并渲染试图,若遇到对js文件,css文件及图片等静态资源的应用,则重复上述步骤并向服务器请求这些资源;
(6)浏览器根据其请求到的资源,数据渲染页面,最终向用户呈现一个完整的页面。
8、TCP的三次握手
在网络数据传输中,传输层协议TCP是要建立连接的可靠传输,TCP建立的连接的过程,我们成为三次握手。
见图-process-扩展
(1)第一次握手:Client将SYN置为1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;
(2)第二次握手:Server收到Client的SYN以后,知道客户端请求建立连接,将自己的SYN置为1,ACK置为1,产生一个acknowledge number=ssequence number+1,并随机产生一个自己的初始序列号,发送给客户端:进入SYN_RCVD状态;
(3)第三次握手:客户端检查acknowledge number是否序列为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器序列号+1,发送给服务器;进入established状态;服务器检查ACK是否为1和
acknowledge number序列号+1之后,也进入Established状态;完成三次握手,连接建立。
简单说就是:
(1)客户端向服务端发送SYN(客户上门都不能确认;服务器确认了对方发送正常)
(2)服务端返回SYN,ACK(客户确认了:自己发送,接受正常,对方发送,接受正常;服务器确认了:自己接受正常,对法发送正常)
(3)客户端发送ACK(客户确认了:自己发送,接受正常,对方发送接受正常噶好难过;服务器确认了:自己发送,接受正常,对方发送接受正常,所以三次握手就能确认双发收功能都正常,缺一不可。)
9、建立连接可以两次握手吗,为什么?可以用四次,为什么?
不可以
因为可能出现已失效的链接请求报文段又传到了服务器端。client发出的第一个链接请求报文段并没有丢失,而是在某个网络节点长时间的滞留了,以致延误到链接释放以后的某个时间才到到Server。本来这是一个早已失效的保温段。
但是Server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要Server发出确认,新的连接就建立了。由于现在client并没有发出建立连接
的请求,因此不会理睬server的确认,也不会向server发送数据。但server缺一微信的运输连接已经建立,并一直等待client发来数据。这样server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。
而且,两次握手无法保证client正确接收第二次握手的报文(servr无法确认client是否收到),也无法保证client和server之间成功互换初始序列号。
四次肯定可以,三次都成功了何况四次,但是会降级传输的效率。
10、第三次握手中,如果客户端的ACK未送达服务器,会怎么样
Server端:由于Server没有收到ACK确认,因此会每隔3秒重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),Client收到后会重新传ACK给Server。
Client端:会出现两种情况:
(1)在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取ACK number,进入establish状态。
(2)在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答。
11、如果已经建立了链接,但客户端出现了故障怎么办
服务器每收到一次客户端的请求后都会重新复位一个计数器,时间通常是设置为2小时,若两小时后还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每个75分钟发送一次。若一连发送10个探测报文仍然没有反应,服务器就人为客户端出现了故障,接着就关闭连接。
12、初始序列号是什么?
TCP连接的一方A,随机选择一个32为的序列号(Sequence Number)作为发送数据的初始序列号(Initial Sequence Number,ISN),比如1000,以该序列号为原点,对要传送的数据进行编号:1001,1002...三次握手时,把这个初始化序列号传送给另一方B,以方便在传输数据时,B可以确认
什么样的数据编号是合法的;同事在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接收。
13、TCP的四次挥手
在网络数据传输中,传输层协议断开连接的过程称为四次挥手
见图-process-扩展
(1)第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
(2)第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
(3)第三次挥手:Server将FIN置为1,发送一个序列号给Clietn;进入LAST_ACK状态;
(4)第四步挥手:Client收到服务器的FIN之后,进入TIME_WAIT状态;接着将ACK置为1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSE状态,不再向客户端发送数据。客户端等待2*MSL(报文最长寿命)时间后,也进入CLOSE状态。完成四次挥手。
简单说就是:
(1)客户端发送FIN
(2)服务端接受FIN,发送ACK
(3)服务端返回FIN
(4)客户端接受FIN
用现实理解三次握手的具体细节
四次挥手断开连接是因为要确定数据全部传输完了
(1)客户与服务器交谈结束后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一次挥手 )
(2)服务器收到客户的消息后说:好的,你要关闭连接了(第二次挥手)。
(3)然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了。(第三次挥手)
(4)客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息(第四次挥手)才挂壁。
14、为什么不能把服务器发送的ACK和FIN结合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后在FIN,断开服务器到客户端的数据传送。
15、客户端TIME_WAIT状态的意义是什么
第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并在此等待2MSL,防止Server没有收到ACK而不断重发FIN。
MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需要的最大时间。如果2MSL,Client都没有在此收到FIN,那么Client推断ACK已经被成功接收,则结束TCP链接。
二、Socket
什么是socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向连读的一端称为socket.Scoket通常用来实现客户端和服务端的链接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个Ip地址和一个端口号唯一确定啊。
在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
Socket偏向于底层,一般很少直接使用Socket来编程。框架底层使用Socket比较多。
三、Http
1、什么是Http协议
Http协议是对客户端和服务器端之间数据之间实现可靠性的传输文字、图片、音频、视频等超文本数据的规范,简称“超文本传输协议”。
Http协议属于应用层,几用户访问的第一层就是http
http请求体由:请求行,请求头,请求数据组成
http响应报文:状态行,响应首部字段,响应内容实体。
2、Socket和Http的区别和应用场景
Socket链接就是所谓的长连接,理论上客户端和服务端一旦建立起连接将不会主动断掉
Socket使用场景:网络游戏,银行持续交互,直播
Http链接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后链接即会断开等待下次链接
Http使用场景:公司OA服务,互联网服务,电商,办公,网站等等。
3、http和Https的区别
其实Https就是从Http加上加密处理(一般是SSL安全通信线路)+认证+完整性保护
区别:
(1)http需要拿到ca证书,需要钱
(2)端口不一样,http是80,https是443
(3)http是超文本传输协议,信息是明文传输。https则是具有安全性的ssl加密传输协议。
(4)http和https使用不同的连接方式(http的连接简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,比http协议安全)