网络相关每日回顾

1、为什么IP不可靠是无连接,可能发生哪些错误。发生错误如何处理?
IP数据包不会对数据传输错误和丢失进行处理,如果在传输过程中出现丢失,则会返回源地址一个信息,如果出错,则会返回一个错误信号。源地址收到ICMP后,会提交给上层协议,由上层进行处理,如果是TCP,则由TCP决定,如果是UDP,则由应用层处理。IP层是尽最大可能转发,交付什么就转发什么。
IP层传送之前不需要建立连接,这样可以简化和提速。
是指不能保证IP数据报能成功到达目的地,是一种尽力而为的传输服务,路由器对IP报错误处理方式是丢包,并发送ICMP给源地址

1、第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)
2、第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3、第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。

第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。

第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。

第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

2、TCP连接握手三次如果没有建立会怎样,为什么要三次,如何应对syn攻击?
客户端发起连接请求,发送一个isn序号,然后服务器收到后返回一个ack的同时发送一个isn序号,客户端收到后返回一个ack确认。
如果没有最后一次握手,那么服务器端发送的信息如果丢失的话,客户端没有收到这个服务器端发出的数据报,而服务器端则认为已经建立了连接,这样服务器端会开始传输数据,而客户端认为连接还未建立,忽略收到的数据报。服务器端因为收到客户端发送的ack,则会继续重传,形成一种死锁。
漏洞,黑客使用大量伪造ip发送连接请求,但是不返回最后一个ack报文,服务器端会不停的重发尝试连接,造成服务器端大量的连接队列被占用,占用系统资源,从而影响或阻止其他用户访问。
常用手段:设置防火墙,关闭半连接队列,缩短半连接队列的timeout时间。

3、TCP四次挥手如何没有建立会怎样?为什么要四次,主要应对?
主动关闭的一方发送FIN信号后,会进入FIN_WAIT_1状态,另一方发送这个FIN的ack后会进入FIN_WAIT_2状态,等到收到另一方发送的FIN信号后,则会进入TIME_WAIT状态。
TIME_WAIT1是一方主动断开,发送FIN的状态,TIME_WAIT2状态则是一对FIN和ack之后,另一方的状态,因为可能还有数据为传输完成。
而服务器端在收到FIN后会进入CLOSE_WAIT状态,等到服务器发送FIN信号后会进入LAST_WAIT状态。

TIME_WAIT状态存在的意义,一是可靠的终止TCP连接,二是保证让迟来的TCP报文段有足够的时间被识别并丢弃。
1如果客户端发送的ACK丢失了,服务器端没有收到ack,那么服务器端会重新发送fin信号。而在LINUX系统中,一个TCP端口不能同时打开多次,当一个TCP连接处于TIME_WAIT状态时,我们无法立即使用连接占用着的端口来建立一个连接。反过来,如果不存在TIME_WAIT状态,应用程序能够建立一个和刚关闭的连接相似的连接,新的连接可能受到原来应用程序数据。

为什么挥手是四次,因为建立连接的过程中ack和isn可以一起发,而挥手的过程中,一方断开并不代表另一方没有数据要传,所以发送的ack不能和fin一起发,因为发送ack后可能还有数据要传。

4、TCP状态转移,连接过程中的状态,断开过程中的状态。服务器和客户端有什么不同。MSL
MSL是报文段最大生存时间,一般是2min。从TIME_WAIT到CLOSED状态的时间。在这个状态,客户端连接要等待2MSL的时间才能完全关闭。
TCP的状态,服务器端则一开始是LISTEN,然后是SYN_RCVD,然后是ESTALISHED,等到收到客户端的FIN信号后,会进入CLOSE_WAIT,状态,等到发送FIN后会进入LAST_WAIT状态,等到收到客户端后进入CLOSED状态。
而客户端一开始是CLOSED,调用connect后会进入SYN_SENT状态,收到ack后进入ESTABLISHED,发送fin后进入FIN_WAIT_1状态,等到收到ACK后进入FIN_WAIT_2状态,等到收到服务器端的FIN信号后进入TIME_WAIT状态,之后在2MSL后进入CLOSED状态。
如果长时间停留在FIN_WAIT_2状态

5、什么是nagle算法
TCP交互数据流,每个交互按键都会产生一个交互分组。每次按键产生的报文包括客户端的按键,服务器的按键确认,服务器的回显报文,客户端的回显报文确认。广域网上的交互数据流可能经手很大的延迟,并且交互数据的微小TCP报文段数量一般很多,这些因素可能导致网络拥塞。
Nagle算法要求一个TCP连接通信双方在任意时刻都最多只能发送一个未被确认的TCP报文段,在该TCP报文段确认到达之前不能发送其他TCP报文段。另一方面,发送方在等待确认的同时收集本端需要发送的微量数据,并在确认到来时以一个TCP报文段将他们全部发生,这样可以减小网络上TCP报文段的数量,同时也有另一个优点在于其自适应性,确认到达得越快,数据也发送得越快。
Nagle算法不能实时的返回,可能会导致延迟。所以有时会关闭Nagle算法。

6、TCP超时重传和超时重连
TCP发送一个数据报后,就会计时,如果在计时范围内没有收到ACK报文,就会重新传送。关键在于超时重传时间,如果太小,会造成网络拥塞,如果太大影响网络传输速率。
7、拥塞控制
如果发生了超时重传,有两种策略,一种是慢启动和拥塞避免和快启动和快恢复。所谓慢启动不是说速度慢,而是一开始的传输窗口为1,然后呈指数增加,之后等到到最大传输窗口的一半之后,转换为线性增长。
而快重传和快恢复。快重传则是指不用等到计时器时间结束,而是一连收到三个相同的ack后,就立刻重新发送接下来的数据报。快恢复是配合快重传使用,进行快重传时,会立刻将传输窗口减半然后线性增长。

8、代理服务器作用
代理服务器分为正向代理服务器和反向代理服务器。正向代理服务器是在客户端和服务器端之间的代理,客户端访问服务器端需要先发送消息给正向代理服务器,然后通过代理服务器发送消息给服务器端。
反向代理则相反。服务器端发送消息给外界,需要通过反向代理,所以对于客户端来说,只知道代理服务器存在,而不了解真实服务器。
正向代理隐藏了客户端,反向代理隐藏了服务器端。

企业中常用的是反向代理,他的作用有
1:安全保护,可以过滤请求
2、实现负载均衡,在多个服务器端上合理分配访问。通过分布式存储布置,常见策略有,轮询,加权轮询,最少链接,加权最少链接,基于局部性的最少链接,基于目标地址哈希,原地址哈希,源端口哈希。随机

什么是负载均衡
在多个计算机、网络连接、磁盘驱动器或其他资源之间分配负载,达到资源最优化利用,最大吞吐率,最小反应时间,避免负载。

通过负载均衡,利用n个廉价服务器可以实现小型机或大型机的计算能力。

9、浏览器键入www.google.com后发生什么
浏览器键入一个网址后

1、浏览器程序会查询对应网址的ip地址
a、首先会查询浏览器缓冲,看是否有
b、如果浏览器缓存没有,则会调用gethostname,查询本地缓存
c、如果本地缓冲也没有,则会向路由器缓存查询
d、如果路由器缓存也没有,就会发送一个UDP报文从ISP递归到根服务器进行查询

2、在找到这个ip地址后,本地会建立一个套接字,发起connect连接,套接字绑定ip和端口,然后通过三次握手和目标服务器建立TCP连接

发送的信息先和连接端口号封装在一个tcp报文中,然后包裹在一个ip报文中,之后向路由端口查询下一跳的mac地址和路由端口,将这些信息包裹在以太帧中发出去,等到了下一个路由器后,路由器会剥离以太帧,查询本地缓存是否包含目标ip的下一条路由端口和mac地址,如果没有则会发送一个包含自己MAC地址的广播给其他路由查询目标IP,其他路由收到这个广播后,如果缓存中包括这个目标IP,这个节点会把自己的mac地址打包后发送给源目标。等收到后把目标mac和封装在里面,向下一个路由传播。等到了服务器端后。服务器端会解析出mac帧中的ip报,服务器调用的listen函数收到数据报中的要访问地址的ip和端口号,会建立一个线程,调用accept建立一个socket用于和客户端进行连接。

3、浏览器发送HTTP报文

4、服务器收到HTTP报文后,对HTTP进行解析,处理请求,生成返回报文发送给客户端

服务器端通过recv函数收到的数据报进行解析,看他是什么类型的请求,然后调用内部函数对请求进行处理,生成返回报文,通过send函数发送给客户端。

5、浏览器收到HTTP报文后,进行解析和渲染

6、双方通过四次挥手断开TCP连接

9、HTTP协议
HTTP,超文本协议,是在客户端和服务器端请求应答的标准。客户端通过HTTP请求到服务器端的指定端口,服务器返回客户端所请求的资源。
HTTP客户发起一个请求,创建一个服务器指定端口的TCP连接,HTTP服务器会监听指定端口的客户端请求,当收到客户端请求后,根据请求内容,返回响应的消息报文。

11、HTTP请求报文和回复报文
HTTP请求共有八种,GET,POST,TRACE,PUSH,PUT,DELETE,CONNECTION,OPTION.
HTTP请求报文包括请求行,请求头、空行和请求数据。
请求行中包括方法,url和HTTP版本。
htpp响应报文包括状态行,消息头,空行和消息正文。
状态行包括协议版本、状态码和具体原因

12、长连接和短连接
HTTP1.默认是短连接就是一次传输后立即断开,所以进行一次http操作就要建立一次http连接。
HTTP1.1默认是长连接,会在消息头中加入一行connection:keep alive;客户端再次访问服务器时,如果在指定时间内,则可以直接利用已建立的连接进行通信。

13、https协议
HTTPS就是带了ssl外壳的http。是一种通过计算机网络能进行安全通信的传输协议,经过http通信,利用ssl或TLS建立全信道,加密数据报。HTTPS主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
ssl也就是安全套接字层,ssl/tls即加密传输协议。

18.Get和post的区别 ?
GET 和 POST 其实都是 HTTP 的请求方法;

  1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。
  2. Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
  3. Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
  4. Get执行效率却比Post方法好。Get是form提交的默认方法。

17、事件处理模式,Reactor和Proactor

18、并发模式:半同步和半异步,领导者和追随者

19、提高服务器性能的方法
采用池的技术,用空间换时间。避免不必要的数据复制,采用零拷贝函数。
减少上下文切换和锁的使用。使用内存数据库,采用分布式系统。

HTTP状态码: 302, 304

2321、TCP粘包
22、TCP心跳包
23、路由器与交换机的区别
24、UDP如何实现可靠传输

TCP/UDP发一个大包有什么区别

如果大量处于TIME WAIT状态怎么办?

10、socket如果一直read不到数据怎么办?

ping得通,但是浏览器访问不成功。怎么排查

如何实现UDP变得可靠呢?

ssl握手过程

作者:offer只要一个
链接:https://www.nowcoder.com/discuss/636014?type=2&order=3&pos=87&page=1&source_id=discuss_tag_nctrack&channel=-1
来源:牛客网

9.TCP与UDP的区别是什么?
1、连接方面区别
TCP面向连接(如打电话要先拨号建立连接)。
UDP是无连接的,即发送数据之前不需要建立连接。
2、安全方面的区别
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。
3、传输效率的区别
TCP传输效率相对较低。
UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。
4、连接对象数量的区别
TCP连接只能是点到点、一对一的。
UDP支持一对一,一对多,多对一和多对多的交互通信。
5、TCP对系统资源要求较多,UDP对系统资源要求较少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言用于封装代码的单元,可以实现代码的复用和模块化。C语言定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言用于存储同类型数据的结构,可以通过索引访问和修改数组的元素。字符串是C语言用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值