计算机网络

image.png

最近在研究一个gorpc源码,感觉自己对计算机网络的理解仅限于名词与公式,对其实现细节一无所知,遂决定重学计算机网络。

首先挂一个教程,讲的特别好:https://www.bilibili.com/video/BV11K411c75T?p=1
再挂一个写的特别好的博客:
https://blog.csdn.net/weixin_43734095/article/details/112449428

image.png

根据TCP/IP协议,互联网的模型被分为4层,从上至下每一层都依赖其底层协议。换言之,Application(应用层) 的协议操作成功的前提是Transport(运输层)的存在。没有运输层就没有应用层。好比没有任何道路的前提下就没有汽车可以行驶。而这种层次上的抽象是让开发者在设定某个层面的协议时不去考虑其他层面的问题。比如我要在运输层设计协议时,我唯一要考虑的是如何将数据从一台计算机传到另外一台,我需要着重的是其稳定性和效率。在解决运输层的问题时我不需要考虑传达的数据是什么类型或内容,因为这样的问题是应用层索要操心的。

HTTP与TCP/UDP协议

HTTP和TCP是存在于不同层面的网络协议,所以他们之间存在着依赖关系。
确切的说是HTTP所设定的所有规则都建立在一个假设之上,那就是运输层的协议在正常运作。HTTP的责任是去定义数据,在两台计算机相互传递信息时,HTTP规定了每段数据以什么形式表达才是能够被另外一台计算机理解。而TCP/UDP所要规定的是数据应该怎么传输才能稳定且高效的传递与计算机之间。

http协议

  1. HTTP协议用于客户端和服务端之间的通信,HTTP的标准建立在将两台计算机视为不同的角色:客户端和服务器。HTTP协议能够明确区分哪端是客户端,哪端是服务端。HTTP协议规定,请求从客户端发出,最后服务端响应应该请求并返回。换句话说,肯定先从客户端开始建立通信,服务端在没有接收到请求之前是不会发送响应的。客户端会向服务器传送不同的请求(request),而服务器会对应每个请求给出回应(response)。

  2. HTTP属于无状态协议(Stateless)。HTTP是不保存状态的协议,即无状态协议。也就是说HTTP协议对于发送过的请求或响应都不做持久化处理。每当有新的请求发送时,就会有新的响应产生。每一个请求之间是没有相关性的。在该协议的规则中服务器是不会记录任何客户端操作,每一次请求都是独立的。(记录用户浏览行为会通过其他技术实现)

  3. 客户端的请求被定义在几个动词意义范围内。最长用到的是GET和POST,其他动词还包括DELETE, HEAD等等。

  4. 服务器的回应被定义在几个状态码之间:5开头表示服务器错误,4开头表示客户端错误,3开头表示需要做进一步处理,2开头表示成功,1开头表示在请求被接受处理的同时提供的额外信息。

  5. 不管是客户端的请求信息还是服务器的回应,双方都拥有一块头部信息(Header)。头部信息是自定义,其用途在于传递额外信息(浏览器信息、请求的内容类型、相应的语言)。

TCP协议

在HTTP的规范内,两台计算机的交互被视为request和response的传递。而在实际的TCP操作中,信息传递会比单纯的传递request和response要复杂。通过TCP建立的通讯往往需要计算机之间多次的交换信息才能完成一次request或response。

TCP的传输数据的核心是在于将数据分为若干段并将每段数据按顺序标记。标记后的顺序可以以不同的顺序被另一方接收并集成回完整的数据。计算机对每一段数据的成功接收都会做出相应,确保所有数据的完整性。

TCP在传递数据时依赖于实现定义好的几个标记(Flags)去向另一方表态传达数据和连接的状态:

  • F : FIN - 结束; 结束会话
  • S : SYN - 同步; 表示开始会话请求
  • R : RST - 复位;中断一个连接
  • P : PUSH - 推送; 数据包立即发送
  • A : ACK - 应答
  • U : URG - 紧急
  • E : ECE - 显式拥塞提醒回应
  • W : CWR - 拥塞窗口减少

也是基于这些标志TCP可以实现三次(three ways handshake)和四次握手 (four ways tear down)。三次握手是初步建立连接的机制,而四次握手则是断开链接。两者之间大致操作是一样的,A发出建立链接(SYN)或者断开链接(FIN)的请求,B认可(ACK)其请求然后发出同样的请求给A并等待A的认可。在双方认可后,链接正式成立或者断开。

这里有两个问题:

  1. 为什么A发出请求并且得到认可后B还有重复同样的动作?

在建立连接的过程中SYN标记代表的是一个随机序列号,因为当文件被切断的时候并不是从0或者1开始标记每段的顺序,所以双方都需要通过传递SYN来告知文件片段的第一个序列是多少号。

  1. 为什么同样的机制,建立链接和断开链接需要握手的次数不同?

三次和四次握手的区别在于,在建立连接时,B的ACK和SYN会一起发送回A,而在断开链接时因为B发送ACK之后还要做其他处理后才能返回FIN,,因此将两步拆开。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×