牛客网:C++面试宝典——计算机网络(2)——TCP/UDP,get/post,socket编程用到的函数,幂等性
● 请问TCP三次握手是怎样的?
SYN=1,seq=x
SYN=1,ACK=1,seq=y,ack=x+1
ACK=1,seq=x+1,ack=y+1
● 请问tcp握手为什么两次不可以?为什么不用四次?
两次不可以:tcp是全双工通信,两次握手只能确定单向数据链路是可以通信的,并不能保证反向的通信正常
不用四次:
四次是将第2步分成的两步进行,可以将其合并,加快握手效率,
● TCP和UDP的区别和各自适用的场景
区别 | TCP | UDP |
连接 | 面向连接的传输层协议,即传输数据之前必须先建立好连接。 | 无连接 |
可靠性 | 可靠交付:无差错,不丢失,不重复,按序到达 | 是尽最大努力交付,不保证可靠交付。 |
服务对象 | 点对点的两点间服务,即一条TCP连接只能有两个端点; | 支持一对一,一对多,多对一,多对多的交互通信。 |
首部开销 | 首部开销大,首部20个字节。 | 首部开销小,8字节。(源端口,目的端口,数据长度,校验和) |
报文长度 | TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,没有”报文边界”的概念 | 面向数据报。UDP原样发送, 既不会拆分, 也不会合并。 |
拥塞控制,流量控制 | TCP有拥塞控制和流量控制保证数据传输的安全性 | UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。 |
适用场景 |
可靠的但传输速度慢 数据完整性需让位与通信实时性 (如文件传输、重要状态的更新等) |
不可靠的但传输速度快 (IP电话、实时视频等) |
● 请你来说一下TCP三次握手四次挥手的过程,为什么tcp连接握手需要三次, time_wait状态
三次握手:参考
客户端:syn_sent
服务器:syn_recv
双方:established
四次挥手:
FIN=1,seq=v
ACK=1,seq=u,ack=v+1
FIN=1,seq=w,ack=v+1
ACK=1,seq=v+1,ack=w+1(msl:报文最大生存时间)
客户端:FIN_wait_1
服务器:close_wait,客户端:fin_wait_2
服务器:last_ack
客户端:time-wait
双方:closed
● 请你来说一说http协议
HTTP协议:超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件,查询结果等)。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL(统一资源定位符)向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
特点:
1、简单快速: 客户向服务器请求服务时,只需传送请求方法和路径。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3、无连接:
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4、无状态:
HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
5、默认端口80
6、基于TCP协议
HTTP 请求/响应的步骤如下:
请求消息:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
响应消息:HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器解析html 文本内容并显示
● 请你来说一下GET和POST的区别
感叹自己的无知,这部分也不懂,阿西
我能记住的就这4点了
1.GET方法提交的数据会放在URL之后,以?分割URL和传输数据。POST方法是把提交的数据放在HTTP包的request body中。
2.GET方法提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
3.GET比POST更不安全,因为参数直接暴露在url中,但是POST方法提交的参数也可以通过F12查看,从安全性考量区别不大。
4.GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
● 请你来说一下socket编程中服务器端和客户端主要用到哪些函数
TCP:
server:
1创建一个socket,用函数socket()
2绑定IP地址、端口等信息到socket上,用函数bind()
3设置允许的最大连接数,用函数listen()
4接收客户端上来的连接,用函数accept()
5收发数据,用函数send()和recv(),或者read()和write()
6关闭网络连接
client
1创建一个socket,用函数socket()
2设置要连接的对方的IP地址和端口等属性
3连接服务器,用函数connect()
4收发数据,用函数send()和recv(),或read()和write()
5关闭网络连接
UDP:
server:
1.建立套接字文件描述符,使用函数socket(),生成套接字文件描述符。
2设置服务器地址和侦听端口,初始化要绑定的网络地址结构。
3绑定侦听端口,使用bind()函数,将套接字文件描述符和一个地址类型变量进行绑定。
4接收客户端的数据,使用recvfrom()函数接收客户端的网络数据。
5向客户端发送数据,使用sendto()函数向服务器主机发送数据。
6关闭套接字,使用close()函数释放资源。UDP协议的客户端流程
client
1建立套接字文件描述符,socket()。
2设置服务器地址和端口,struct sockaddr。
3向服务器发送数据,sendto()。
4接收服务器的数据,recvfrom()。
5关闭套接字,close()。
PS:为什么分层:
分层的目的是利用层次结构可以把开放系统的信息交换问题分解到一系列容易控制的软硬件模块-层中,而各层可以根据需要独立进行修改或扩充功能,
PS:因为tcp是全双工的,上边的四部确认了数据在两个方向上都是可以正确到达的,但是2,3步没有没有上下的联系,可以将其合并,加快握手效率,所有就变成了3步握手。
● 请你说一下http协议会话结束标志怎么截出来?
看tcp连接是否有断开的四部挥手阶段。
● 请你说一说TCP/IP数据链路层的交互过程
网络层等到数据链层用mac地址作为通信目标,数据包到达网络等准备往数据链层发送的时候,首先会去自己的arp缓存表(存着ip-mac对应关系)去查找改目标ip的mac地址,如果查到了,就讲目标ip的mac地址封装到链路层数据包的包头。如果缓存中没有找到,会发起一个广播:who is ip XXX tell ip XXX,所有收到的广播的机器看这个ip是不是自己的,如果是自己的,则以单拨的形式将自己的mac地址回复给请求的机器
什么是幂等性
https://www.jianshu.com/p/9d46a730284e
https://www.cnblogs.com/leechenxiang/p/6626629.html
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...
-
异步请求获取门票
-
调用支付,传入门票
-
根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果
-
返回结果到客户端
HTTP中,get,put,delete是幂等的,post不是幂等的