Skip to content
View Perryen's full-sized avatar
  • PKU
  • China

Block or report Perryen

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Please don't include any personal information such as legal names or email addresses. Maximum 100 characters, markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Perryen/README.md
description
阅读随笔

小林coding-图解网络

一、基础篇

1、TCP/IP网络模型有几层

设备异构性的解决方案 通用的网络协议

应用层

FTP(File Transport Protocol,文件传输协议)

HTTP(Hypertext Transfer Protocol,超文本传输协议)

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)

DNS(Domain Name System,域名系统)

Telnet(远程终端协议)

传输层

TCP(传输控制协议,Transmission Control Protocol):流量控制、超时重传、拥塞控制

TCP段(TCP Segment):数据包分块 MSS:Maximum Segment Size

传输层的报文中会携带端口号,因为它服务应用层,端口号用来区分报文是发给哪个应用

网络层

IP 协议(Internet Protocol

ICMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议

分片:MTU: Maximum Transmit Unit

IP地址:32位,网络号(ip和掩码按位与),主机号(IP和取反的掩码按位与),寻址和路由

网络接口层

以太网通讯要用到MAC地址

ARP协议


网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。

2、键入网址到网页显示,期间到底发生了什么

解析URL

生成HTTP请求信息

DNS查询服务器域名对应的IP地址

协议栈

​ TCP三次握手

​ TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。客户端请求的端口号是什么?-阿里云开发者社区 (aliyun.com)

​ FCS:Frame Check Sequence 帧校验序列

二、TCP篇

TCP头部格式:

源端口号和目标端口号

序列号:建立连接时随机数生成,通过SYN包传给接收端主机,每发送一次就累加一次该数据字节数的大小,用来解决网络包乱序问题

确认号:指下一次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为这个序号以前的数据都已经被正常接收,用来解决丢包的问题。

控制位:(这些控制位的组合可以用来控制TCP连接的建立、数据传输和连接关闭等过程)

URG:Urgent,表示紧急指针字段的值是否有效。1为有效。

ACK:Acknowledgment,表示确认应答字段的值(确认号)是否有效。1为有效

PSH:Push,表示接受方应该立即将数据交给应用层,而不是等待缓冲区填满,该位一般需要再快读传输数据的场景下使用

RST:Reset,表示连接复位,即中断连接,当该位置被设置为1时,表示发生了错误或异常情况,需要中断连接

SYN:Synchronize,表示建立连接请求,在三次握手过程中,发送方发送的SYN包会将该位置设为1

FIN:Finish,表示连接关闭请求,在连接关闭过程中,发送方发送的FIN包会将该位设置为1

服务端通常都是固定在某个本地端口上监听、等待客户端的连接请求,那么服务端最大并发TCP数量为客户端的ip数乘上客户端的端口数

但是服务器最大并发TCP连接数远不能达到理论上限,因为会受到一些因素影响:

其一就是文件描述符限制。每个TCP连接都被视为一个文件,因为在unix-like操作系统中,文件描述符(file descriptor)是对打开文件的引用,在这种操作系统中,一切都被视为文件,包括设备、管道、套接字等,因此TCP连接也被视为文件,通过文件描述符来引用。如果文件描述符被占满了,意味着系统已经达到了它所允许的最大文件描述符数量,会导致新的连接请求无法被接受,为了解决这个问题,可以采取以下措施:

  1. 增加系统允许的最大文件描述符数量,可以通过修改系统配置或使用命令行参数来实现
  2. 释放不再使用的文件描述符,及时关闭已经建立的连接,以便为新的连接腾出文件描述符
  3. 优化程序设计,减少不必要的文件描述符的使用,例如通过复用已有的连接来减少新连接的创建

那么在Windows中tcp连接并不被视为文件,因此没有与之对应的文件描述符的概念,windows使用不同的机制来管理和操作网络连接,在windows下网络连接是通过套接字来表示和操作的,套接字是一种抽象的通信端点,用于在网络上进行数据传输,windows提供了一组API函数来创建和操作套接字,以实现网络通信。与unix-like不同,windows下的套接字使用句柄(Handle)来引用和操作。句柄是一种通用妈的对象引用,可以表示文件、设备、进程、线程等。在windows中,套接字句柄是一种特殊类型的句柄,表示网络连接

因此,在windows中,tcp连接不是一个文件,也没有与之相对应的文件描述符,相反,它是通过套接字句柄来引用和操作的,这是windows和unix-like系统在网络连接管理上的一个区别。

那么在linux中对可打开的文件描述符的数量分别做了三方面的限制:系统级、用户级、进程级

其二是内存限制,每个tcp连接都需要占用一定的内存,os的内存是有限的,如果内存资源被占满后,就会发生OOM

所谓OOM就是Out of Memory,意思是内存不足。

OOM错误可能会导致一下 情况:

  1. 系统崩溃或死机:当操作系统无法为重要的系统进程或内核模块分配所需要的内存时,就可能会崩溃或死机
  2. 进程崩溃或终止:当一个进程无法获取所需的内存时,可能会崩溃或被操作系统终止
  3. 内存分配失败:当系统无法为新的内存分配请求提供充足的内存空间时,分配操作可能会失败,导致程序无法正常运行或执行特定操作

OOM错误通常是由下面原因引起的:

  1. 内存泄漏:程序中存在内存泄漏,即分配的内存没有被正确释放,导致内存耗尽
  2. 内存过度分配:程序请求了过多的内存,超过了系统的可用内存限制
  3. 系统资源限制:系统设置了最大可用内存限制,当达到这个限制时,就会发生OOM错误

未来避免OOM错误,开发人员可以采取以下措施:

  1. 合理管理内存:及时释放不再使用的内存,避免内存泄漏
  2. 优化内存使用:减少内存的占用,避免过度分配内存
  3. 监控系统资源:定期监控系统的内存使用情况,及时采取措施避免内存不足
  4. 使用内存管理工具:检测和解决内存相关的问题

tcp和UDP的区别:

连接、服务对象、可靠性、拥塞控制、流量控制、首部开销、传输方式、分片不同

MSS (Maximum Segment Size) 是指在TCP/IP协议中,每个TCP分段(Segment)中的数据部分的最大长度。MSS的大小由网络设备(如路由器)在建立TCP连接时协商确定,通常是根据网络链路的最大传输单元(MTU)来决定的。MSS的大小会影响TCP连接的性能,较大的MSS可以提高传输效率,但也可能导致更多的数据丢失和延迟。
MTU (Maximum Transmission Unit) 是指在计算机网络中,数据链路层能够传输的最大数据包的大小。MTU的大小由网络设备和网络协议决定,不同类型的网络链路(如以太网、无线网络等)有不同的MTU值。MTU的大小会影响网络传输的效率和可靠性,较大的MTU可以提高传输效率,但也可能导致更多的数据丢失和延迟。

传输层的端口号的作用时为了区分同一个主机上不同应用程序

Popular repositories Loading

  1. Typora_Picture Typora_Picture Public

    存储typora里的图片

  2. CV CV Public

    CV课程作业

    Jupyter Notebook

  3. Digital-media Digital-media Public

  4. AI AI Public

    Jupyter Notebook

  5. doris doris Public

    Forked from apache/doris

    Apache Doris is an easy-to-use, high performance and unified analytics database.

    Java

  6. fucking-algorithm fucking-algorithm Public

    Forked from labuladong/fucking-algorithm

    刷算法全靠套路,认准 labuladong 就够了!English version supported! Crack LeetCode, not only how, but also why.

    Markdown