1.计算机网络漫谈:
https://www.jianshu.com/p/c793a279f698
2.面试常考题:
https://www.nowcoder.com/discuss/1937
3.TCP/IP中的几个标识:SYN, FIN, ACK, PSH, RST, URG.
SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)
SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。
具体详情请移步:https://blog.csdn.net/moshenglv/article/details/52085067
4. TCP/IP 三次握手,四次挥手
三次握手:
四次挥手:
TCP状态迁移图
客户端的状态变迁:CLOSED-->SYN_SENT-->ESTABLISHED-->FIN_WAIT_1-->FIN_WAIT_2-->TIME_WAIT-->CLOSED
服务器的状态变迁:CLOSED-->LISTEN-->SYN_RCVD-->ESTABLISHED-->CLOSE_WAIT-->LAST_ACK--->CLOSED
CLOSED:这个状态不是一个真正的状态,是图中假想的一个起点或者是终点
LISTEN: 服务器等待连接过来的状态
SYN_SENT: 客户端发起连接(主动打开),变成此状态,如果SYN超时,或者服务器不存在直接CLOSED
SYN_RCVD:服务器收到SYN包的时候,就变成此状态,
ESTABLISHED:完成三次握手,进入连接建立状态,说明此时可以进行数据传输了
FIN_WAIT_1:客户端执行主动关闭,发送完FIN包之后便进入FIN_WAIT_1状态
FIN_WAIT_2:客户端发送FIN包之后,收到ACK,即进入此状态,其实就是半关闭的状态
TIME_WAIT:这个状态从图上看,有3中情况,从FIN_WAIT_2进入,客户端收到服务器发送过来的FIN包之后进入TIME_WAIT状态,有CLOSING状态进入,这是同时关闭的状态,同时发起FIN请求,同时接收并做了ACK的回复,从FIN_WAIT_1进入,收到对端的FIN,ACK,并回复ACK,这个地方感觉是,FIN和ACK是一块来的.
CLOSE_WAIT:接收到FIN之后,被动的一方进入此状态,并回复ACK
LAST_ACK:被动的一端发送FIN包之后 处于LAST_ACK状态
CLOSING:两边同时发出FIN请求
https://blog.csdn.net/wdscq1234/article/details/52416641
如果两次握手就建立连接,可能导致服务器端接收到过期的连接请求后建立连接,从而浪费资源。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发送数据。B的许多资源就这样白白浪费了。
6.四次挥手释放连接,等待2MSL的意义(或者说为什么要有TIME_WAIT状态?)?
(1).为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
(2).就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
7 .ARP的中文意思是(地址解析协议),请用简单语言说明其的工作原理。
(1). 首先,每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。
(2). 当源主机需要将一个数据包要发送到目的主机时,对应会首先检查自己 ARP列表中是否存在该 IP地址的MAC地址, 如果有就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。
(3). 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址;
(4). 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
- 客户端向服务器发送一个SYN J
- 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
- 客户端再想服务器发一个确认ACK K+1
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。
重点参考该博客:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html- 服务器端:
– 申请一个socket (socketWatch)用来监听的
– 绑定到一个IP地址和一个端口上
– 开启侦听,等待接授客户端的连接
– 当有连接时创建一个用于和连接进来的客户端进行通信的socket(socketConnection)
– 即续监听,等侍下一个客户的连接
- 客户端:
– 申请一个socket(socketClient)
– 连接服务器(指明IP地址和端口号)
- 本机的IP地址:192.168.1.100
- 子网掩码:255.255.255.0
- 网关的IP地址:192.168.1.1
- DNS的IP地址:8.8.8.8
然后打开浏览器访问谷歌的网址:www.google.com,按下回车。这意味着,浏览器要向Google发送一个网页请求的数据包。
第一步:
主机会像DNS服务器发送请求,已知DNS服务器为8.8.8.8,于是我们向这个地址发送一个DNS数据包(53端口);然后,DNS服务器做出响应,告诉我们Google的IP地址是172.194.72.105。于是,我们知道了对方的IP地址。
第二步:
接下来,我们要判断,这个IP地址是不是在同一个子网络,这就要用到子网掩码。已知子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做一个二进制的AND运算(两个数位都为1,结果为1,否则为0),计算结果为192.168.1.0;然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不相等,所以结论是,Google与本机不在同一个子网络。
第三步:
因此,我们要向Google发送数据包,必须通过网关192.168.1.1转发,也就是说,接收方的MAC地址将是网关的MAC地址。至此发送的各种必要参数已经基本确定了,数据包也可以发送了。
- 浏览器向DNS服务器查找输入URL对应的IP地址。
- DNS服务器返回网站的IP地址。
- 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接
- 浏览器获取请求页面的html代码。
- 浏览器在显示窗口内渲染HTML。
- 窗口关闭时,浏览器终止与服务器的连接。
10.交换机与路由器的差别?
交换机主要工作在数据链路层(第二层)
路由器工作在网络层(第三层)。 转发依据不同
交换机转发所依据的对象是:MAC地址。(物理地址)
路由转发所依据的对象是:IP地址。(网络地址) 主要功能不同
交换机主要用于组建局域网,连接同属于一个(广播域)子网的所有设备,负责子网内部通信(广播)。
路由主要功能是将由交换机组好的局域网相互连接起来,或者将他们接入Internet。
交换机能做的,路由都能做。
交换机不能分割广播域(子网),路由可以。
路由还可以提供防火墙的功能。
路由配置比交换机复杂。
重点可以参考:https://blog.csdn.net/justloveyou_/article/details/78303617