计算机网络基础知识

计算机网络基础知识

TCP/IP 四层结构


ps: 上图中是图解HTTP中的划分

  • 应用层

    决定了向用户提供应用服务时通信的活动

  • 传输层

    提供处于网络连接中的两台计算机直接的数据传输

  • 网络层 或 网际层

    处理网络上流动的数据包

  • 网络接口层 对应 OSI 中的 链路层+物理层

    处理连接网络的硬件部分

应用层

HTTP协议
  • HTTP请求报文格式

  • HTTP响应报文格式

GET请求与POST请求的区别?

  • GET请求参数出现在url中,POST请求数据写入报文主体
  • GET请求封装在一个TCP报文中发出,POST 被浏览器拆分,先发首部,再发数据
  • GET请求时幂等的,POST不是

传输层

TCP
  • TCP 连接的建立

三次握手过程(三握手报文)及目的

目的:建立可靠的通信信道,简单地说,就是通信双方都确认自己与对方的接收与发送都是正常的。

序号 方向 动作 效果
1 Client -> Sever 发送带有SYN标志的数据包 Server确定自己接收正常;对方发送正常
2 Server -> Client 发送带有SYNACK标志的数据包 Client确定自己发送正常,接收正常;对方发送正常
3 Client -> Server 发送带有ACK标志的数据包 Server确认自己发送正常,接收正常;对方发送正常,接收正常

为什么要进行3次握手?

  • 防止之前的请求建立连接报文滞留网络中,当报文到达Server端是2,对报文确认,此时会打开2条连接。第三次握手的存在可以使客户端忽略服务端对滞留报文的确认。
  • 通过3次握手,双方才能初始化通信时的序号seq和ack,即ISN(Intial Sequence Number)和 MSS
  • 通过次握手,通信双方才能知道自己和对方 发送和接收功能都正常

Question:有没有其它握手方案?

  • 可以将第二次握手 Server -> Client 发送SYN,ACK 报文拆分成两次 一次发送 SYN 一次发送ACK
  • 三次握手已经是最佳方案,握手次数不能比3少,可以比3多,但握手次数多消耗资源也更多
  • TCP 连接的释放

四次挥手

对可靠的通信信道进行关闭

序号 方向 动作 效果
1 Client -> Server 发送带有FIN的数据包 Client提出关闭请求,进入只接收不发送状态
2 Server -> Client 发送带有ACK的数据包 Server回应收到关闭请求
3 Server -> Client 发送带有FIN的数据包 Server提出关闭请求
4 Client -> Server 发送带有ACK的数据包 Client发送最后一个ACK 通道关闭

为什么要进行四次挥手?

  • TCP连接是全双工的,双方都要主动关闭连接和确认对方关闭
  • 如果两边同时断开连接,就会进入CLOSING状态,然后到达TIME_WAIT状态,双方都会浪费2MSL时间
  • ps: RFC793 3.5节中提到,如果Server收到FIN后没有数据要发送了,那么就回复一个FIN,ACK 四次握手就变成了3次,(多次出现[ F.]、[F.]、[.]三个序列,即3次挥手)

TIME-WAIT 为何等待2MSL?

ps: MSL 为最长报文寿命

  • 保证最后一个ACK被服务端收到,没收到可以再发送,并重置2MSL定时器
  • 保证本地端口号在2MSL时间内不会被再次使用,避免新连接中出现旧连接的请求报文

如何避免TIME_WAIT

  • 调整Linux内核参数
    • 修改/etc/sysctl.conf 设置 net.ipv4.tcp_tw_reuse = 1 复用TIME_WAIT状态下的socket
    • net.ipv4.tcp_tw_recycle = 1 加速TIME_WAIT状态下的socket回收
  • 设置Nginx等服务器
    • 设置keepalive 属性 让服务器不要主动关闭连接,除非连接超时
  • 使用RST报文来关闭连接
    • RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。
  • 设置socket属性:SO_REUSEADDR
    • 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用 端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息, 指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧 使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期 望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不 可能。

CLOSE-WAIT 存在意义?

通知上层应用,通道即将关闭,尽快把剩余的数据发出,上层应用将剩余数据发送完成后,确认关闭后,Server才发出 FIN 报文

TCP提供可靠传输服务的原因

  • 可靠传输的工作原理

1.停止等待协议

每发送完一个分组就停下来,等待对方的确认,收到确认后再发送下一个分组

2.连续ARQ协议

发送方每收到一个确认就把发送窗口向前移动一个分组的位置

  • 可靠传输的实现

1.滑动窗口协议

2.超时重传机制

UDP

网络层

链路层÷

全部评论

相关推荐

07-18 22:55
海南大学 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司10个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-07 14:33
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务