网络编程综合知识

1.Tcp协议和udp协议区别

(1)TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

(2)TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

(3)TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)  

(4)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

(5)TCP首部开销20字节;UDP的首部开销小,只有8个字节

(6)TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

2.Post和get区别

(1)请求

GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。

因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。

(2)传输数据的大小

在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。

对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。

(3)安全性

POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击。

3.cookie 和session 的区别

(1)cookie数据存放在客户的浏览器上,session数据放在服务器上。

(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

(4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

(5)建议:将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。

4.请简单说一下三次握手和四次挥手?

三次握手过程:

1 首先客户端向服务端发送一个带有 SYN 标志,以及随机生成的序号 100(0 字节)的报文

2 服务端收到报文后返回一个报文(SYN200(0 字节),ACk1001(字节+1))给客户端

3 客户端再次发送带有 ACk 标志 201(字节+)序号的报文给服务端

至此三次握手过程结束,客户端开始向服务端发送数据。

简单理解:

1 客户端向服务端发起请求:我想给你通信,你准备好了么?

2 服务端收到请求后回应客户端:I'ok,你准备好了么

3 客户端礼貌的再次回一下客户端:准备就绪,咱们开始通信吧!

整个过程跟打电话的过程一模一样:

1 喂,你在吗

2 在,我说的你听得到不

3 恩,听得到(接下来请 开始你的表演)

补充:SYN:请求询问,ACk:回复,回应。

四次挥手过程:

由于 TCP 连接是可以双向通信的(全双工),因此每个方向都必须单独进行关闭(这句话才是精辟,后面四个挥手过程都是其具体实现的语言描述)

四次挥手过程,客户端和服务端都可以先开始断开连接

1 客户端发送带有 fin 标识的报文给服务端,请求通信关闭

2 服务端收到信息后,回复 ACK 答应关闭客户端通信(连接)请求

3 服务端发送带有 fin 标识的报文给客户端,也请求关闭通信

4 客户端回应 ack 给服务端,答应关闭服务端的通信(连接)请求

5.说一下什么是 tcp 的 2MSL?

主动发送 fin 关闭的一方,在 4 次挥手最后一次要等待一段时间我们称这段时间为 2MSL

TIME_WAIT 状态的存在有两个理由:

1.让 4 次挥手关闭流程更加可靠

2.防止丢包后对后续新建的正常连接的传输造成破坏

6.长链接与短链接的区别?

(1)短连接

连接->传输数据->关闭连接

HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束后就中断连接。短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

(2)长连接

连接->传输数据->保持连接->传输数据->....->关闭连接

长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

7.HTTP协议状态码作用及意思

作用:告诉用户当前操作所处的状态

200 OK 服务器成功处理了请求(这个是我们见到最多的)

301/302 Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置

304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存

404 Not Found 未找到资源

501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服

8.死锁

(1)原因: 1.竞争资源2.程序推进顺序不当

(2)必要条件:1.互斥条件2.请求和保持条件3.不剥夺条件4.环路等待条件

(3)处理死锁基本方法:

  • 1、预防死锁(摒弃除1以外的条件)
  • 2、避免死锁(银行家算法)
  • 3、检测死锁(资源分配图)  

(4)解除死锁:

  • 1.剥夺死锁
  • 2.撤销进程

9.浏览器发送一个请求到返回一个页面的具体过程。 从输入http://www.baidu.com/到页面返回,中间都是发生了什么?

第一步,解析域名,找到ip

浏览器会缓存DNS一段时间,一般2-30分钟不等,如果有缓存,直接返回ip,否则下一步。

缓存中无法找到ip,浏览器会进行一个系统调用,查询hosts文件。如果找到,直接返回ip,否则下一步。

进行1 和2 本地查询无果,只能借助于网络,路由器一般都会有自己的DNS缓存,ISP服务商DNS缓存,这时一般都能够得到相应的ip,如果还是无果,只能借助于DNS递归解析了。

这时ISP的DNS服务器就会开始从根域名服务器开始递归搜索,从.com 顶级域名服务器,到baidu的域名服务器。 到这里,浏览器就获得网络ip,在DNS解析过程中,常常解析出不同的IP。

第二步,浏览器于网站建立TCP连接

浏览器利用ip直接网站主机通信,浏览器发出TCP连接请求,主机返回TCP应答报文,浏览器收到应答报文发现ACK标志位为1,表示连接请求确认,浏览器返回TCP()确认报文,主机收到确认报文,三次握手,TCP连接建立完成。

第三步,浏览器发起默认的GET请求

浏览器向主机发起一个HTTP-GET方法报文请求,请求中包含访问的URL,也就是http://www.baidu.com/还有User-Agent用户浏览器操作系统信息,编码等,值得一提的是Accep-Encoding和Cookies项。Accept-Encoding一般采用gzip,压缩之后传输html文件,Cookies如果是首次访问,会提示服务器简历用户缓存信息,如果不是,可以利用Cookies对应键值,找到相应缓存,缓存里面存放着用户名,密码和一些用户设置项

第四步,显示页面或返回其他

返回状态码200 OK,表示服务器可以响应请求,返回报文,由于在报头中Content-type为“text/html”,浏览器以HTML形式呈现,而不是下载文件。 但是对于大型网站存在多个主机站点,往往不会直接返回请求页面,而是重定向。返回的状态码就不是 200 OK,而是301,302以3开头的重定向吗。浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新第一步访问即可。

10.创建一个简单tcp服务器需要的流程

  • (1)socket创建一个套接字
  • (2)bind绑定ip和port
  • (3)listen使套接字变为可以被动链接
  • (4)accept等待客户端的链接
  • (5)recv/send接收发送数据

 11.UDP 总结

 使用 udp 发送/接收数据步骤:

1.创建客户端套接字

2.发送/接收数据

3.关闭套接字

import socket


def main():
    # 1、创建 udp 套接字
    # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
    # socket.SOCK_DGRAM 数据报套接字,只要用于 udp 协议
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2、准备接收方的地址
    # 元组类型 ip 是字符串类型 端口号是整型
    dest_addr = ('192.168.113.111', 8888)
    # 要发送的数据
    send_data = "我是要发送的数据"
    # 3、发送数据
    udp_socket.sendto(send_data.encode("utf-8"), dest_addr)
    # 4、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据
    # 接收到的数据是一个元组 (接收到的数据, 发送方的 ip 和端口)
    # 1024 表示本次接收的最大字节数
    recv_data, addr = udp_socket.recvfrom(1024)
    # 5、关闭套接字
    udp_socket.close()


if __name__ == '__main__':
    main()

编码的转换 str -->bytes: encode 编码

bytes--> str: decode()解码

UDP 绑定端口号:

1.创建 socket 套接字

2.绑定端口号

3.接收/发送数据

4.关闭套接字

import socket


def main():
    # 1、创建 udp 套接字
    # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
    # socket.SOCK_DGRAM 数据报套接字,只要用于 udp 协议
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2、绑定端口
    # 元组类型 ip 一般不写 表示本机的任何的一个 ip
    local_addr = ('', 7777)
    udp_socket.bind(local_addr)
    # 3、准备接收方的地址
    # 元组类型 ip 是字符串类型 端口号是整型
    dest_addr = ('192.168.113.111', 8888)
    # 要发送的数据
    send_data = "我是要发送的数据"
    # 4、发送数据
    udp_socket.sendto(send_data.encode("utf-8"), dest_addr)
    # 5、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据
    # 接收到的数据是一个元组 (接收到的数据, 发送方的 ip 和端口)
    # 1024 表示本次接收的最大字节数
    recv_data, addr = udp_socket.recvfrom(1024)
    # 6、关闭套接字
    udp_socket.close()


if __name__ == '__main__':
    main()

注意点:绑定端口要在发送数据之前进行绑定。

12. TCP 总结

 TCP 客户端的创建流程:

1.创建 TCP 的 socket 套接字

2.连接服务器

3.发送数据给服务器端

4.接收服务器端发送来的消息

5.关闭套接字

import socket


def main():
    # 1、创建客户端的 socket
    # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
    # socket.SOCK_STREAM 流式套接字,只要用于 TCP 协议
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、构建目标地址
    server_ip = input("请输入服务器端的 IP 地址:")
    server_port = int(input("请输入服务器端的端口号:"))
    # 3、连接服务器
    # 参数:元组类型 ip 是字符串类型 端口号是整型
    client_socket.connect((server_ip, server_port))
    # 要发送给服务器端的数据
    send_data = "我是要发送给服务器端的数据"
    # 4、发送数据
    client_socket.send(send_data.encode("gbk"))
    # 5、接收服务器端恢复的消息, 没有消息会阻塞
    # 1024 表示接收的最大字节数
    recv_date = client_socket.recv(1024)
    print("接收到的数据是:", recv_date.decode('gbk'))
    # 6、关闭套接字
    client_socket.close()


if __name__ == '__main__':
    main()

TCP 服务器端的创建流程:

1.创建 TCP 服务端的 socket

2.bing 绑定 ip 地址和端口号

3.listen 使套接字变为被动套接字

4.accept 取出一个客户端连接,用于服务

5.recv/send 接收和发送消息

6.关闭套接字

import socket


def main():
    # 1、创建 tcp 服务端的 socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、绑定
    server_socket.bind(('', 8888))

    # 3、listen 使套接字变为被动套接字
    server_socket.listen(128)

    # 4、如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
    # client_socket 用来为这个客户端服务
    # tcp_server_socket 就可以省下来专门等待其他新客户端的链接
    client_socket, client_addr = server_socket.accept()

    # 5、接收客户端发来的消息
    recv_data = client_socket.recv(1024)
    print("接收到客户端%s 的数据:%s" % (str(client_addr), recv_data.decode('gbk')))

    # 6、回复数据给客户端
    client_socket.send("收到消息".encode('gbk'))

    # 7、关闭套接字
    client_socket.close()
    server_socket.close()


if __name__ == '__main__':
    main()

注意点:

tcp 服务器一般都需要绑定,否则客户端找不到服务器

tcp 客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的 ip、port 等信息就好, 本地客户端可以随机

tcp 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 tcp 服务器时必须要做的

当客户端需要链接服务器时,就需要使用 connect 进行链接,udp 是不需要链接的而是直接发 送,但是 tcp 必须先链接,只有链接成功才能通信

当一个 tcp 客户端连接服务器时,服务器端会有 1 个新的套接字,这个套接字用来标记这个客户 端,单独为这个客户端服务

listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而 accept 返回的新套接字是标识这个新客户端的

关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之 前已经链接成功的客户端正常通信。

关闭 accept 返回的套接字意味着这个客户端已经服务完毕

当客户端的套接字调用 close 后,服务器端会 recv 解阻塞,并且返回的长度为 0,因此服务器可 以通过返回数据的长度来区别客户端是否已经下线;同理 当服务器断开 tcp 连接的时候 客户端同样也会收到 0 字节数据。

13.怎么实现强行关闭客户端和服务器之间的连接?

在 socket 通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则调 用 socket 的 close 方法,循环结束,从而达到关闭连接的目的。

14.简述 TCP 和 UDP 的区别以及优缺点?

UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。

优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送

缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,也不重复发送,不可靠。

TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手

优点:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。

缺点:TCP 相对于 UDP 速度慢一点,要求系统资源较多。

15.简述浏览器通过 WSGI 请求动态资源的过程?

1.发送 http 请求动态资源给 web 服务器

2.web 服务器收到请求后通过 WSGI 调用一个属性给应用程序框架

3.应用程序框架通过引用 WSGI 调用 web 服务器的方法,设置返回的状态和头信息。

4.调用后返回,此时 web 服务器保存了刚刚设置的信息

5.应用程序框架查询数据库,生成动态页面的 body 的信息

6.把生成的 body 信息返回给 web 服务器

7.web 服务器把数据返回给浏览器

16.描述用浏览器访问 www.baidu.com 的过程

先要解析出 baidu.com 对应的 ip 地址

  • 要先使用 arp 获取默认网关的 mac 地址
  • 组织数据发送给默认网关(ip 还是 dns 服务器的 ip,但是 mac 地址是默认网关的 mac 地址)
  • 默认网关拥有转发数据的能力,把数据转发给路由器
  • 路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关
  • 目的网关(dns 服务器所在的网关),把数据转发给 dns 服务器
  • dns 服务器查询解析出 baidu.com 对应的 ip 地址,并原路返回请求这个域名的 client 得到了 baidu.com 对应的 ip 地址之后,会发送 tcp 的 3 次握手,进行连接
  • 使用 http 协议发送请求数据给 web 服务器
  • web 服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器。
  • 浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
  • 浏览器关闭 tcp 连接,即 4 次挥手结束,完成整个访问过程

17.Post 和 Get 请求的区别?

GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&连接。URL 的编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非 ASCII 字符都要编码之后再传输。

POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上面的 item=bandsaw 就是实际的传输数据。 因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则不会。

传输数据的大小:

在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限制。但是在实际开发过程中,对于 GET,特定的浏览器和服务器对 URL 的长度有限制。因此,在使用 GET 请求时,传输数据会受到 URL 长度的限制。

对于 POST,由于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST 提交数据大小进行限制,Apache、IIS 都有各自的配置。

安全性:

POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面 GET 提到的安全方法 中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过 GET 请求, 用户名和密码都会暴露再 URL 上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET 请求提交的数据还可能会造成 Cross-site request frogery 攻击。

效率:

GET 比 POST 效率高。

POST 请求的过程:  

1.浏览器请求 tcp 连接(第一次握手)

 2.服务器答应进行 tcp 连接(第二次握手)  

3.浏览器确认,并发送 post 请求头(第三次握手,这个报文比较小,所以 http 会在此时进行第一次数据发送)  

4.服务器返回 100 continue 响应  

5.浏览器开始发送数据  

6.服务器返回 200 ok 响应

GET 请求的过程:

1.浏览器请求 tcp 连接(第一次握手)

 2.服务器答应进行 tcp 连接(第二次握手)  

3.浏览器确认,并发送 get 请求头和数据(第三次握手,这个报文比较小,所以 http 会在此时进行第一次数据发送)  

4.服务器返回 200 OK 响应

18.HTTP 协议状态码有什么用,列出你知道的 HTTP 协议的状态码,然后讲出他们都 表示什么意思?

通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。

常见的状态机器码有:

100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。

200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)。

300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的 url)。 304、307(使用缓存资源)。

400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服务器拒绝访问, 权限不够)。

500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的情况)。

19.为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?

1、为了保证客户端发送的最后一个 ACK 报文段能够达到服务器。这个 ACK 报文段可能丢失, 因而使处在 LAST-ACK 状态的服务器收不到确认。服务器会超时重传 FIN+ACK 报文段,客户端就 能在 2MSL 时间内收到这个重传的 FIN+ACK 报文段,接着客户端重传一次确认,重启计时器。最 后,客户端和服务器都正常进入到 CLOSED 状态。如果客户端在 TIME-WAIT 状态不等待一段时间, 而是再发送完 ACK 报文后立即释放连接,那么就无法收到服务器重传的 FIN+ACK 报文段,因而也不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入 CLOSED 状态。

2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 确认报文段 后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样 就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

20.说说 HTTP 和 HTTPS 区别?

HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安 全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer)协议用于 对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。简单来说,HTTPS 协议是由 SSL+HTTP 协 议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全。

HTTPS 和 HTTP 的区别主要如下:

1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。

2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。

3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。

4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、 身份认证的网络协议,比 http 协议安全。

21.谈一下 HTTP 协议以及协议头部中表示数据类型的字段?

HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网 (WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。

HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于 1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW 中 使用的是 HTTP/1.0 的第六版,HTTP/1.1 的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)的建议已经提出。

HTTP 协议工作于客户端-服务端架构为上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。

表示数据类型字段: Content-Type

22.HTTP 请求方法都有什么?

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。

HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

1、GET 请求指定的页面信息,并返回实体主体。

2、HEAD 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头

3、POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在 请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。

4、PUT 从客户端向服务器传送的数据取代指定的文档的内容。

5、DELETE 请求服务器删除指定的页面。

6、CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

7、OPTIONS 允许客户端查看服务器的性能。

8、TRACE 回显服务器收到的请求,主要用于测试或诊断。

23.使用 Socket 套接字需要传入哪些参数 ?

Address Family 和 Type,分别表示套接字应用场景和类型。

family 的值可以是 AF_UNIX(Unix 域,用于同一台机器上的进程间通讯),也可以是 AF_INET (对于 IPV4 协议的 TCP 和 UDP),至于 type 参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw 套接字)。

24.HTTP 常见请求头?

1. Host (主机和端口号)

2. Connection (链接类型)

3. Upgrade-Insecure-Requests (升级为 HTTPS 请求)

4. User-Agent (浏览器名称)

5. Accept (传输文件类型)

6. Referer (页面跳转处)

7. Accept-Encoding(文件编解码格式)

8. Cookie (Cookie)

9. x-requested-with :XMLHttpRequest (是 Ajax 异步请求)

25.七层模型? IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?

IP: 网络层

TCP/UDP: 传输层

HTTP、RTSP、FTP: 应用层协议

26 .url 的形式?

形式: scheme://host[:port#]/path/…/[?query-string][#anchor]

scheme:协议(例如:http, https, ftp)

host:服务器的 IP 地址或者域名

port:服务器的端口(如果是走协议默认端口,80 or 443)

path:访问资源的路径

query-string:参数,发送给 http 服务器的数据

anchor:锚(跳转到网页的指定锚点位置) http://localhost:4000/file/part01/1.2.html

27.僵尸进程和孤儿进程,怎么避免僵尸进程?

(1)孤儿进程

父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(进 程号为1)所收养,并由init进程对它们完成状态收集工作。

(2)僵尸进程

进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。

(3)避免僵尸进程的方法:

  • 1.fork两次用孙子进程去完成子进程的任务。
  • 2.用wait()函数使父进程阻塞。
  • 3.使用信号量,在signal handler中调用 waitpid,这样父进程不用阻塞。

28.当输入 http://www.itheima.com 时,返回页面的过程中发生了什么?

1)浏览器向 DNS 服务器发送 itheima.com 域名解析请求;

2)DNS 服务器返回解析后的 ip 给客户端浏览器,浏览器向该 ip 发送页面请求;

3)DNS 服务器接收到请求后,查询该页面,并将页面发送给客户端浏览器;

4)客户端浏览器接收到页面后,解析页面中的引用,并再次向服务器发送引用资源请求;

5)服务器接收到资源请求后,查找并返回资源给客户端;

6)客户端浏览器接收到资源后,渲染,输出页面展现给用户。

29.TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手?

        首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双工。 单工为只能A给B发,B不能给A发; 或者是只能B给A发,不能A给B发。

        我们假设A和B是通信的双方。我理解的握手实际上就是通信,发一次信息就是进行一次握手。

  • 第一次握手: A给B打电话说,你可以听到我说话吗?
  • 第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗?
  • 第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦!

        在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到。 这样,就可以开始正常通信了。

        注意: HTTP是基于TCP协议的,所以每次都是客户端发送请求,服务器应答,但是TCP还可以给其他应用层提供服务,即可能A、B在建立链接之后,谁都可能先开始通信。

        如果两次,那么B无法确定B的信息A是否能收到,所以如果B先说话,可能后面的A都收不到,会出现问题 。

        如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。

30.为什么说TCP是可靠的呢?

        TCP又称为可靠传输协议,这个可靠是指数据一定可以毫无遗漏的交给对方。

        首先TCP是一种面向有链接的协议,首先经过三次握手建立连接,只有在确认通信对端存在时才会发送数据。       

        TCP首先会按照顺序给发送的数据标上号码。TCP每发送一个数据报,都会期待一个接收端ACK的回复,我们就知道接收端已经收到消息了。如果短时间内没有收到ACK,那么TCP就会对消息进行自动重发。 

        因为TCP丢包之后,会做数据校验,然后重传数据。接收方每收到一个数据包就发送一次确认,发送方设置定时器,如果定时没有收到接收确认就重传。

        有两种,一种是丢多少重传多少,一种是从丢弃的地方重新传送数据,一般是后面一种。 并且针对传输的流量,TCP会做限制,尽量保证网络的最大传输效率,保证接受方稳定接受。 

31.进程间通信方式有哪些?

  • 管道(管道是一种半双工的通信方式,数据只能单向流动,而且只有具有亲缘关系(即父子进程)的进程间使用)
  • FIFO
  • 消息队列(消息队列是由消息的链表存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓存冲区大小受限制等的缺点)
  • 信号(信号是一种比较复杂的通信方式,用于通知接收某个事件已经发生)
  • 信号量(信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止进程正在访问共享资源时,其它进程也访问此资源)
  • 共享内存(共享内存就是映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,多个进程都可以访问)
  • UNXI域套接字
  • 套接字(Socket)(与其它进程间通信机制不同的是,它可用于不同设备及其间的进程通信)

32. DNS域名解析全过程?

DNS(Domain Name System)是“域名系统”的英文缩写。DNS是应用层协议。

 当一个用户在地址栏输入:http://www.baidu.com时,DNS解析过程大致如下:

  1. 浏览器首先查看自身缓存中是否存在被解析过的这个域名的IP地址,如果有,则解析结束。同时域名被缓存的时间也通过TTL属性来设置。
  2. 如果浏览器缓存中没有,浏览器会查看操作系统中始有存在对应的已经解析过的结果,操作系统也有一个域名解析的过程。(Windows中可以通过C盘中的一个hosts文件来设置,如果指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址)
  3. 如果还没有该域名的IP地址,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般存在于离你不远的某个地方,一般都会缓存域名解析结果;
  4. 如果本地域名服务器还没有该域名的IP地址,就直接跳到根域名服务器请求解析;
  5. 根域名服务器返回给本地域名服务器一个所查询的主域名服务器地址(gTLD Server,国际顶尖域名服务器,如.com,.cn,.org)
  6. 此时本地域名服务器再向上一步返回的gTLD发送请求
  7. gTLD接受请求后返回这个域名对应的Name Server的地址(Name Server即为该网站注册的域名服务器)
  8. Name Server根据映射关系表找到目标IP,然后返回给本地服务器
  9. 本地服务器缓存这个域名和对应的IP地址
  10. 本地服务器把解析的结果返回给客户,用户可以根据TTL值缓存到本地系统中,域名解析到此结束。

33.线程间的通信方式?

1.锁机制:包括互斥锁、条件变量、读写锁

        互斥锁提供了以排他方式防止数据结构被并发修改的方法

        读写锁允许多个线程同时读共享数据,而对写操作是互斥的

        条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的,条件变量始终与互斥锁一起使用。

2.信号量机制:包括无名线程信号量和命名线程信号量

3.信号机制:类似于进程间的信号处理。

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

34.对whois的理解及其作用、用途? 

        Whois简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期等)。

        域名Whois是用来查询域名所有者、域名的IP等信息的传输协议。通过域名Whois查询我们可以得到域名注册商、联系人、联系方式、注册时间、到期时间、域名服务器、状态等,还可以查询到公司、地址、电话更详细的信息。

35.如何分辨IP是内网IP还是公网IP? 

直观法:

1、10开头的IP都是内网IP。即10.0.0.0 到 10.255.255.255是内网IP。

2、以下IP段的地址都是内网IP地址。

  • 10.0.0.0 到 10.255.255.255
  • 172.16.0.0 到172.31.255.255
  • 192.168.0.0 到192.168.255.255

36、动态域名、长域名和静态域名解析

动态域名、长域名和静态域名解析是三种不同的域名解析方式。

1、动态域名解析

        动态域名解析指将动态IP地址射到一个定的域名上,因为动态IP地址可能会发生变化,所以需要使用动态域名解析服务,将动态IP地址与域名进行绑定,使得用户能够通过域名访问到动态IP地址对应的服务器。

        常见的动态域名解析服务包括DynDNS、No-IP等。

2、长域名解析

        长域名解析是指将一个较长的域名映射到一个短的域名上。这种解析方式可以方便用户记忆和使用,同时也可以提高网站的品牌知名度。

        常见的长域名解析服务包括Bitly、TinyURL等。

3、静态域名解析

        静态域名解析是指将域名映射到一个固定的IP地址上。这种解析方式适用于服务器IP地址不发生变化的情况下,可以提高网站的访问速度和稳定性。

        静态域名解析一般由域名注册商或DNS服务商提供,用户需要在域名管理后台进行相应设置。

        总之,动态域名解析、长域名解析和静态域名解析都是常见的域名解析方式,选择合适的解析方式可以提高网站的用户体验和稳定性。

37、家庭宽带移动基站

        家庭宽带移动基站是一种能够将宽带网络转换为移动网络的设备。它可以通过SIM卡连接到移动网络,同时提供Wi-Fi信号,让家庭内的移动设备可以通过它连接到移动网络。这种设备通常适用于以下情况:

1、家庭内的宽带网络信号不稳定,但是移动网络信号良好,可以通过家庭宽带移动基站提供的移动网络连接来解决网络问题。

2、家庭内有移动设备需要使用移动网络,但是没有移动信号或者信号不稳定,可以通过家庭宽带移动基站提供的移动网络连接来满足需求。

3、家庭内有多个移动设备需要连接到移动网络,但是使用多个移动网络套餐费用较高,可以通过家庭宽带移动基站提供的移动网络连接来实现多个设备共享一个移动网络套餐。

        总之,家庭宽带移动基站可以提供方便快捷的移动网络连接,让家庭内的移动设备可以更加便捷地使用移动网络。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值