网络方面心得总结

4、输入一个网址,发生了啥?

1)首先浏览器会根据输入的URL进行DNS解析查找相应的IP,DNS根据域名查询IP地址的过程为:浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> 本地(ISP)域名服务器缓存 -> 根域名服务器缓存

2)浏览器得到IP之后,向服务器发送TCP来连接,经过三次握手

3)建立连接后,浏览器向服务器发送HTTP请求

4)服务器接受请求后,解析请求头,返回响应头,其中包括200表示成功,3开头表示重定向、4开头表示客户端错误、5开头表示服务器端错误

5)浏览器解析渲染HTML界面

6)关闭TCP连接,经过4次挥手。

5、tcp和udp的区别

1)tcp面向连接,udp面向无连接(发送数据前不需要建立连接)

2)tcp提供可靠的服务,传送数据无差错、不丢失、不重复且按需到达,udp尽最大能力交付,不保证可靠交付

3)tcp面向字节流,udp面向报文,udp没有拥塞控制

4)tcp是点到点的,udp支持一对一、一对多、多对多

5)tcp的逻辑通信信道是全双工的可靠信道,udp是不要可靠信道

TCP三次握手(首先是Closed状态,2-4-3):

1)建立连接时,客户端发送syn包(SYN=1,seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认

2)服务器收到syn包,确认客户端的SYN ,同时自己也发送一个syn+ack包(SYN=1,ACK=1,seq=y,ack=x+1),此时服务器进入SYN_RECV状态

3)客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=1,seq=x+1,ack=y+1),此时客户端和服务端进入established状态

TCP四次挥手(首先是established状态 2-3-4-3):

1)客户端停止发送数据,并且发送连接释放报文段(FIN=1,seq=u),此时客户端进入fin-wait-1状态(终止等待1)

2)服务器收到连接释放报文段,发出确认报文(ACK=1,seq=v,ack=u+1),此时服务端进入CLose-wait(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务端的方向就释放了,这社会处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受

3)客户端收到服务器的确认请求后,此时,客户端进入fin-wait-2(终止等待2)状态

4)服务器将最后的数据发送完毕后,发送连接释放报文(FIN=1,ACK=1,seq=w,ack=u+1),此时服务器进入last-check(最后确认)状态

5)客户端收到服务器的连接释放报文后,发出确认(ACK=1,seq=u+1,ack=w+1),并进入time-wait(时间等待)状态,此时tcp连接并未释放,必须经过2个最大报文生存时间才进入closed状态

6)服务器收到客户端发出的确认。立即进入closed状态。

问题1:为什么连接的时候是三次握手,关闭的时候却是四次挥手?

因为服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文,其中SYN用来同步,ACK用来应答,但是关闭连接连接是,当服务端收到FIN报文,很可能并不会立即关闭socket,所以只能先回复一个ACK报文,表示已经客户端的FIn报文,只有等服务端的所有数据都发送完才会发送FIn报文给客户端,因此需要四步。

问题2:为什么不能用两次握手进行连接,需要进行第三次握手?

3次握手完成两个重要的功能,既要双方做好发送数据的准备工作,也要允许双方就初始序列号进行协商,如果改成两次握手,可能会发生死锁,因为在服务端向客户端发送的报文可能会在传输的过程中丢失,而不知道客户端是否已经准备好,可能导致服务端忽略客户端的数据,而客户端则会重复发送同样的数据,形成死锁(或者因为客户端的滞留连接和超时重传的连接都到达,从而导致服务器打开两个连接)。

问题3:为什么time-wait状态需要经过2个最大报文生存时间才能返回到closed状态?

第一、有可能最后一个ack丢失,所以time-wait状态就是用来重发可能丢失的ack报文,服务端若是没有收到ack,将会一直重发fin报文,2个最大报文生存时间就是一个发送和回复的最大时间。

第二、是为了让本连接持续时间内所产生的所有报文段从网络中消失,使得下一个新的连接不会出现旧的连接请求报文段。

问题4:如果已经建立了连接,客户端突然出现了故障怎么办?

TCP设有一个保活计时器。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常设置为两小时,若两小时没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次,若一连发送10次后没有反应,服务器就会认为客户端出现了故障,从而关闭TCP连接。

问题5:tcp如何实现可靠传输?

1)首先,采用三次握手来建立TCP连接,四次握手来释放TCP连接,从而保证建立的传输信道是可靠的

2)其次,TCP采用连续ARQ协议(回退N、超时重传(位与发送窗口的多个分组连续发送出去,不需要等待对方的确认,当收到一个分组的确认,发送窗口向前滑动一位,接收方则对按需到达的最后一个分组发送确认,把丢失的再重传N个分组))来保证数据传输的正确性,使用滑动窗口协议来保证接收方能够及时处理所接收到的数据,进行流量控制。

3)最后,TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞。(慢开始最初设置cwnd拥塞窗口为1,当收到确认后,将cwnd加倍并设置一个阈值ssthresh,当cwbd大于这个阈值时,进入拥塞避免,每次将cwnd加1,如果出现超时,则令阈值等于cwnd的一半,重新慢开始;接受方收到三个重复确认,可以确定下一个报文丢失,立即快重传;快恢复则将ssthresh=cwnd/2,cwnd=ssthresh)

问题6:DNS使用的是什么协议?

区域传输时使用TCP,其他时候使用UDP(如域名解析),主要是因为UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节,区域传输时数据同步传送的数据量比一个请求和应答的数据量多得多,而查询域名返回的内容一般不超过512字节,用udp快。

问题10:排查cpu过高?

1)首先top查找cpu定位问题进程

2)然后使用ps -mp pid -o THREAD,tid,time定位问题线程

3)查看问题线程堆栈情况(先将线程id转为16进制,printf “%x\n” tid,再用jstack打印线程堆栈信息 jstack pid | grep tid -A 30)

4)如果是内存问题的话,使用jstat -gcutil查看进程的内存情况,下载到本地进行分析。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值