그 비밀의 네트워크를 찾아보기로 이동

배경


네트워크, 네트워크 ...

너무 많은 이야기와 지식을 숨 깁니다 뒤에 만 간단한 용어이지만, 그러나 그녀는입니다.

그 가난한 프로그래밍의 생활은, 헤이, 빙산의 팁을 탐험 아마도에만 ...

시간, 인식하면서, 학습은 끝이 없지만, 아무 의미도 알려져 있습니다. 재생 성격,하지만 빈 흐름 시간입니다. 후회 ...

그래서 위선적 제외하고,의는 정확히 전송 네트워크를 탐색 할 수 있습니다.

개요


1

어떤 프로그램의 뷰 (확대으로 저장), 네트워크의 영역을 탐색.

본문


I.는 HTTP 요청 메시지를 생성

이

웹 사이트를 열고 URL이 브라우저에서 시작 입력, 우리는 여기에서 연구하고있다.

HTTPS : 대표는 물론, 다른 프로토콜이 있습니다, 웹 서버를 방문하는 것입니다 : HTTPS는 동안, 우리는, 액세스 대상에 브라우저를 합의에게 있습니다. FTP와 같은 : FTP 서버에 액세스 할 수 있습니다.

sexyphoenix.github.io는 웹 서버의 도메인 이름, 당신은 어디에서 웹 서버를 찾을 수 우리를 알 수 있습니다.

대한 / 파일 경로 이름 내부 웹 서버, 여기에 대해 디렉토리 이름, 전체 경로에 대한 / index.md하지만 index.md github에 숨겨해야 할 수있다.

할 수있는 브라우저 제일 먼저 URL을 구문 분석하는 것입니다, 우리는 당신이 웹 서버에 액세스하려는 알고 약 디렉토리의 기본 파일 sexyphoenix.github.io 파일 경로입니다.

액세스하려는 목표를 알고, 다음 브라우저가 HTTP 요청 정보,이에 대한 소개를 생성합니다, 우리는 HTTP 프로토콜과 채팅을합니다.

두 부분에, HTTP 프로토콜은 내용을 정의하고 클라이언트와 서버 통신, 간단히 말해서 단계 "무엇을""종류의 작업의" .

그래서 POST, GET, DELETE, PUT과 : 위의 해결되었습니다 "무엇", "행동의 종류"는 HTTP의 주요 방법이다. HTTP 형식 일견도.

삼

둘째, 웹 서버의 IP 주소 질의

生成HTTP信息之后,接下来,我们就要发送信息给Web服务器了。但此时我们突然发现我们只有Web服务器的域名,并不知道服务器究竟在哪里。

那么我们应该如何像现实中送快递一样,快速的定位到哪一幢哪一室,讲到这里,想必大家都有所意会了,IP。

IP地址

IP地址实际就是4个字节,32比特的数字,每8个比特为1组,具体看下图十进制表示。

4

我们发送的信息,就是通过子网的集成器找到最近的路由器,再通过路由器(基于IP设计)找到最优抵达Web服务器的路由器,这样不断的查找网络中的路由器节点,最终抵达Web服务器。

注意,我们的Web服务器的IP是最终的目的地,它是贯穿路由器---N---路由器---Web服务器整个环节的,是判断整个网络走向的依据,存在控制信息中。

路由器都有自己的IP,路由器到路由器就是根据Web服务器的IP(走向),通过本身的IP来移动。

到这里,我们也就了解清楚了通过IP,发送的信息最终可以抵达Web服务器。

那么,我们现在的问题就是如何通过Web服务器的域名找到它的IP? 讲到这里,想必大家又都有所意会了,DNS。

域名解析

简单的来说,DNS服务器维持了一系列关系表,也就是域名和IP对于的关系表。浏览器向最近的DNS服务器询问“sexyphoenix.github.io”的IP地址是多少,DNS服务器会回答Web服务器IP为xxx。这一步也叫域名解析

讲到这里,我们就要深究一下,浏览器究竟是怎样向DNS服务器发送查询的?

首先,我们要清楚一点,浏览器等应用程序本身是不能发送信息的,而是委托给操作系统来发送的。

而操作系统有一个超级出名的库,Socket库,它是调用网络功能的程序组件集合。

Socket库里面有一个函数。

IP信息 = gethostbyname("sexyphoenix.github.io") # 看,应用程序查询IP很简单,调用一个函数即可

发送数据有两种协议,UDP和TCP,域名查询用的是UDP。数据短速度快。

介绍了域名解析,下面来了解一下DNS服务器的工作。

DNS服务器

5

在上面已经提到过了,DNS服务器维护了一个关系表,上图的类型A表示域名对应IP地址,MX表示域名对应的邮箱服务器,不同的类型,返回的信息有所不同。

DNS服务器的工作就是根据域名和类型,查找相关的记录,并向应用程序返回响应信息。

DNS服务器查找

全球共有13台根域名服务器,根域名用“.”表示,其次才是下面的一级域名“com.”、“net.”等,我们平时访问的域名“sexyphoenix.github.io.”后面有一个点,平时被省略。

我们用一张图来看下查找顺序,更清楚些。

6

先找最近的DNS服务器(一般是本机设置的),没有再从根域找,然后不断的向下找,直到找到我们Web服务器IP所在的DNS服务器。

三、TCP/IP传输数据

通过DNS服务器查询,我们已经得到的Web服务器的IP,接下来就要开始发送数据了。而这部分也是比较难写的一部分,因为我们要深入协议栈的内部,去了解它的结构。

我们都知道数据的传输,都是由上层委托给下层工作的。应用程序将发送的信息的行为委派给了操作系统,而操作系统内部就是通过协议栈来工作的。

来看下操作系统协议栈图。

(7)

上部分是TCP协议和UDP协议,都是负责数据的收发部分,区别在于TCP是面向连接的,是一种可靠的协议,而UDP只负责发送,不保证准确到达。

下部分是IP协议,负责发送网络包,其中还包括ICMP协议(检查发送过程是否存在错误)和ARP协议(查询MAC地址)。

数据收发

在查询IP地址的时候,我们用到了Socket库,这里同样也需要用到它。

不过我们这里需要调用多个组件,才能实现数据的收发,从功能上可以分为四个部分。

  1. 创建套接字 (new Socket)

  2. 连接服务器的套接字 (connection)

  3. 收发数据 (write、read)

  4. 删除套接字 (close)

在讲之前,我们先了解下套接字。

套接字在数据收发中是相当重要的,它是一块内存空间,里面存放着很重要的的控制信息

这些控制信息存放着通信对象的IP地址、端口、连接状态、响应时间、数据收发情况等等,只有这些存在,才能知道数据发送到哪里,又发送了多少,有没有错误等等。

创建套接字

创建套接字还是非常简单的,直接调用Socket库中的socket组件即可,创建完成之后会返回一个标识符,标识符的主要作用就是为了区别不同的套接字。

连接服务器的套接字

连接服务器用到的是connect组件,参数有标识符、服务器的IP、端口等,相当于和服务器之间连接了一条数据管道,后期数据在其中流通。

同时在这里也会发生著名的“三次握手”。

在刚发生连接阶段,管道里面是没有数据的,但是会有控制信息,这些控制信息包括TCP头部,以太网头部、IP头部。

控制信息

根据层级来,我们会先生成TCP头部,TCP头部格式有很多字段,其中重要的就是双方的端口,序号,ACK号,控制位,窗口等。稍微了解一下这些字段的作用。

端口

端口和IP是一同存在的,在互联网早期的时候,公司联网都是直接用公网IP的,但随着互联网的发展,公网IP越来越少,于是就出现了公网和内网的区别。

内网IP范围

  1. 10.0.0.0 ~ 10.255.255.255

  2. 172.16.0.0 ~ 172.31.255.255

  3. 192.168.0.0 ~ 192.168.255.255

每个公司的内部都使用这些内网IP,再通过唯一的一个公网IP访问互联网,这样就可以节省大量的公网IP。

那么公司的这些设置内网IP的电脑是如何通过唯一的公网IP访问互联网呢? 互联网返回的信息又是怎么通过唯一的公网IP,定位到公司的某一台电脑上的?

地址转换(NAT),这个技术就解决了上面的问题,它的原理就是在转发网络包时对IP头部地址和端口进行改写。

而端口在其中的作用至关重要,它可以让路由器(公网IP)知道是那一台内网的电脑与互联网通信,具体看下图。

8

公司IP为192.168.23.183的电脑,通过49158端口向互联网发送连接,当到达公司的公网路由器的时候,路由器的IP模块会对控制信息进行改写,最后变成IP为121.225.19.59,端口为1001和通信对象通信。

同时将这条记录保存在路由器上,当通信对象返回信息时,会通过表格中的信息找到对应的内网电脑IP。

序号

发送方告诉接收方该网络包在所有发送的数据的第几个字节,序号的初始值是在连接阶段随机生成的(防止攻击者猜到),在下面的收发数据阶段,就是以这个序号为基数。

ACK号

接收方告诉发送发已经收到所有数据的第几个字节,相当于序号+发送的数据长度。

控制位

每一个比特代表不同的控制信息,看下图。

9

图中解释了比较重要的控制位。

窗口

接收方告诉发送方的窗口大小,如果接收方接受的速度比较慢,一起传送的数据量就会变小相当于控制了我们传送数据的快慢。

介绍了TCP头部的关键字段,接下来我们开始进入连接。

首先,我们会将客户端的控制位的SYN(1)、生成随机序号M、窗口大小等,再通过其他层,到达服务器端(第一次握手)。

服务器收到SYN为1的信息,知道客户端要和我连接,生成ACK号(M+1)、服务器随机序号N(通信是双向的,这时的服务器也相当于发送方)、控制位SYN(1)、窗口等发送(第二次握手)。

客户端收到服务器端的信息,得到ACK号,知道连接正常,发送ACK号(N+1,服务器端的序号)、控制位SYN(1),告诉服务器已建立连接(第三次握手)。

收发数据

管道连接建立成功后,就进入了数据收发阶段。

我们发送的信息一般都是比较大的,不可能一次性发送完毕,所以在TCP模块,就会将应用数据切分成数据块,切分的每个数据块(MSS,最大数据长度)加上TCP头部,IP头部不能超过MTU大小(MTU,最大传输单元)。

接下来,交给IP模块,生成IP头部和MAC头部信息,再通过网卡驱动,网卡设备将数字信息转变成电信号,传输到接收方。接收方收到信息,会返回ACK号,重复以上步骤,直到接收方收到所有数据。

接收方收到全部数据后,同样会向发送方发送数据,下面的步骤都和上面差不多了,这里不再赘述。

(10)

删除套接字

和接收方通信完成之后,套接字不会再使用,这时就可以删除套接字了。

套接字删除可以由任何一方发起,这里假设接受方发起,下面就来讲讲著名的“四次挥手”。

接收方收到全部数据后,等待一会就会删除套接字。

  1. 接收方生成断开信息,即将TCP的头部控制位的FIN设置为1,发送给客户端。

  2. 客户端返回ACK号,表示发送的信息无误。

  3. 客户端所有数据处理完成后,向服务器发送FIN为1的断开信息。

  4. 服务器返回ACK号,表示发送的信息无误,等待一会,发送方和接收方都删除套接字。

讲到这里,数据收发的绝大数内容就讲完了,接下来我们聊一聊IP模块。

IP模块

前面提到过,在IP模块会生成IP头部和以太网头部。那么这两个头部究竟有什么作用?

为了便于理解,我们这里就讲的简单一些。

发送的数据到达子网的集线器或者交换机,通过MAC表,找到下一个转发设备的MAC地址,以“以太网协议”传输到下一个转发设备。

转发设备根据目标地址的IP和“IP协议”判断下一个转发设备的IP,再通过MAC地址,传输到下一个转发设备。

就这样,经过多个转发设备的接力后,网络包最终到达接收方的网络设备。

总结:IP协议根据目标地址判断一下个IP转发设备的位置,再通过以太网协议将网络包输出到下一个转发设备

四、到达Web服务器

사실, 웹 서버에 도달하기 전에, 우리는 또한 디지털 신호를 전자 신호로 변환하는 방법에 대한 이야기를해야합니까? 데이터 및 방법은 연산자를 통해 웹 서버에 도달?

오직이 부분도 관련 하드웨어 및 운영 및 유지 보수 방향의 대부분, 여기에 대해 이야기하지, 복잡하다.

먼저, 웹 서버의 배포에 대한의 이야기를하자.

웹 서버 배포 세 가지 방법이 있습니다

  1. 회사의 내부 네트워크에 직접 배치했다.

  2. 이 회사의 인트라넷과 웹 서버를 별도로 배치했다. 액세스 네트워크 후, 다음, 통합 방화벽을 배포 및하면 네트워크와 서버 내에서 이동했다.

  3. 웹 서버는 이동 통신사의 데이터 센터에 배치했다.

위에서 아래 세 가지 방법, 더 나은 성능과 보안을 받고 있지만, 관리는 몇 가지 문제가있을 수 있습니다.

안전 및 부하 공유를 들어, 웹 서버가 방화벽 앞에 배치됩니다, 당신은 또한 등등로드 밸런서, 캐시 서버, 컨텐츠 배포 등을 할 수 있습니다.

여과의 데이터 레이어 후, 마지막으로 웹 서버에, 위의 단계와 절차의 서버는 약간 다른 연결을 만들 수 있습니다.

  1. 첫 번째는 소켓 (소켓)를 만드는 것입니다.

  2. 바인딩 소켓 및 포트 번호 (바인드).

  3. 연결 대기 (듣기).

  4. 수락 연결 (동의).

서버 프로그램은 클라이언트 연결을 기다리고있는 것입니다.

실제 파일 이름 및 응답으로 URI를 기반으로 클라이언트의 요청, 웹 서버를 수신하면. 다음과 같은 형식입니다.

(11)

여기, 여기에 우리의 모든 콘텐츠.

마지막으로, 나는 당신에게 건강과 매일 행복 프로그래밍, 행복을 찾고를 바랍니다. 이봐 ...

추천

출처www.cnblogs.com/SexyPhoenix/p/11949468.html