TCP/IP协议族

TCP/IP(传输控制协议/网际协议)是用于计算机通信的一个协议族。

TCP/IP协议族包括诸如Internet协议(IP)、地址解析协议(ARP)、互联网控制信息协议(ICMP)、用户数据报协议(UDP)、传输控制协议(TCP)、路由信息协议(RIP)、Telnet、简单邮件传输协议(SMTP)、域名系统(DNS)等协议。

1. 应用层 应用层包含一切与应用相关的功能,我们经常使用的HTTP、FTP,Telnet、SMTP等协议都在这一层实现。

2. 传输层 传输层负责提供可靠的传输服务。在该层中,典型的协议是TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。其中,TCP提供可靠、有序的,面向连接的通信服务;而UDP则提供无连接的、不可靠用户数据报服务。

3. 网际层 网际层负责网络间的寻址和数据传输,在该层中,典型的协议是IP(Internet Protocol)。

4. 网络接口层 最下面一层是网络接口层,负责数据的实际传输.网络接口层在发送端将上层的IP数据报封装成帧后发送到网络上;数据帧通过网络到达接收端时,该结点的网络接口层对数据帧拆封,并检查帧中包含的MAC地址。如果该地址就是本机的MAC地址或者是广播地址,则上传到网络层,否则丢弃该帧。

图1 TCP/IP协议栈

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnel)。

尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。

通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

图2 组成元素

如图,web服务器接入于公网,ip地址为61.155.154.42, url为www.demo.com。 资源文件包括index.html,index.js,index.css,others位于服务器的虚拟根目录下,index.html索引文件index.js,index.cs

若用户在浏览器的地址栏中输入www.demo.com并回车键确认,则将触发以下流程:

· 浏览器所在客户端主机通过DNS查询,获取www.demo.com所对应的ip地址,并作为客户端与该ip地址对应的服务端建立http连接

· 浏览器向服务器发起http根请求,浏览器从本机取出根文件index.html并回应浏览器

· 浏览器从根请求回应中解析index.html文件中所引入的资源文件列表index.js,index.css等文件

· 浏览器再次分别向服务器发起index.js,index.css等文件请求

· 浏览器获取所有文件之后,解析渲染出所有资源文件,提供ui接口给用户

图4 资源获取流程

http代理服务器即是一个http协议的中继。其所完成的任务是插入浏览器与服务器之间的通信,截获浏览器的http请求,并模拟浏览器向服务器发起http请求,并把服务器的http回应,转回应于浏览器。这个动作对应浏览器来说,是透明的,

但是对于开发者来说,可以在代理服务器上做手脚,修改双向的报文。可以通过两种方式来实现http代理,其一为应用程序代理,其二tcp代理,其特征分别为:

应用层代理,浏览器与代理服务器,代理服务器与服务器两个通信组队之间,分别建立tcp连接,并进行tcp数据传输。代理服务器与浏览器握手之后,截获浏览器发出的GET报文,获取HOST字段与服务器握手,并把GET报文进行处理之后,转发给服务器,等待服务器的回包,并转发给浏览器。整个流程可以在应用层完成。

可以看出代理服务器对客户端上来的GET报文有修改

1、HTTP/1.1修改为HTTP/1.0, 这样修改有两个作用,服务器对HTTP/1.0请求的回应报文没有Content-Length, 或CHUNCK的标示,而这两个标示与应用程序数据的长度相关,如果采用HTTP/1.1的请求,则在修改服务器的回包之后(回包长度发生变化),需要重新修改Content-Length或CHUNCK两个属性的值,而这两个值的修改增加了开发的难度;

2、服务器对HTTP/1.0回应不会保持长连接,即图中服务器响应index.html之后,tcp连接关闭,这样对于代理软件来说,软件容易稳定,降低了开发难度。

TCP层代理

Ø TCP报文插入

在TCP层做报文注入,涉及到了修改报文双向sequence, ack-sequence值的问题。原因在于seq值与ack值与实际报文长度相关,如果修改了报文长度,显然需要修改seq, ack值:

图6 TCP之SEQ与ACK

Ø TCP层代理报文插入

如图7所示,代理需要维护两个状态机,收到服务端带fin报文的数据包之后,和服务端完成结束握手;同时去除fin报文的fin标志,把改报文发给浏览器,同时完成和浏览器的报文插入以及结束握手:

图7 TCP之SEQ与ACK

Ø TCP层代理状态机

1. Eth0收到http报文的结束帧(带fin)

2. 代理去掉fin标志

3. 代理插入一段报文,并加上fin标志

4.浏览器对原始的http结束报文回应fin:

问题:看起来服务器到浏览器的fin报文,并没有被代理扔掉,故而浏览器收到了两帧fin报文。

TCP/IP和HTTP协议代理的更多相关文章

  1. http与https与socket tcp/IP与UDP 协议等

    网络由下往上分为:   物理层--                       数据链路层-- 网络层--                       IP协议 传输层--               ...

  2. TCP/IP 和HTTP 协议基础知识

    来源:http://www.myhack58.com/Article/60/63/2014/50072.htm 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过 ...

  3. TCP/IP及http协议 SOAP REST

    TCP/IP及http协议: TCP/IP协议主要解决数据如何在网络中传输, 而HTTP是应用层协议,主要解决如何包装数据 SOAP:简单对象访问协议(Simple Object Access Pro ...

  4. TCP/IP 5层协议簇/协议栈

    TCP/IP 5层协议簇/协议栈 数据/PDU 应用层 PC.防火墙 数据段/段Fragment 传输层 防火墙 报文/包/IP包packet 网络层 路由器 帧Frame 数据链路层 交换机.网卡 ...

  5. TCP/IP 笔记 - Internet协议

    IP是TCP/IP协议族中的核心协议,TCP.UDP.ICMP.IGMP数据都通过IP数据报传输.IP提供了一种"尽力而为.无连接"的数据交付服务:尽力而为表示不保证IP数据报能成 ...

  6. TCP/IP 笔记 - 地址解析协议

    地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射.ARP仅用于IPv4,IPv6使用邻居发现协议,它被合并入ICMPv6.地址解析是发现两个地址之间的映射关系的过程 ...

  7. OSI,TCP/IP,五层协议的体系结构,以及各层协议

    OSI分层 (7层):物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP分层(4层):网络接口层. 网际层.运输层. 应用层. 五层协议 (5层):物理层.数据链路层.网络层. ...

  8. Java TCP/IP与HTTP协议个人总结(原创)

    首先举个例子方便理解: 1.应用层(http.ftp)就类似:淘宝.京东.易购等网购网站,主要用来负责选择购买商品(制定协议). 2.传输层(TCP.UDP)就类似:中通.申通等物流公司,主要负责传送 ...

  9. TCP/IP各层协议数据格式

    ISO规范里定义了7层网络模型,实际常用的仍为TCPIP四层网络模型. 注:本文章插图均来自<图解TCP/IP>. 数据链路层帧格式 经常说的帧格式为以太网帧格式,由于类型和帧长度字段不重 ...

随机推荐

  1. WordPress后台添加友情链接管理功能

    其实很早之前WordPress是有这个功能的,但是伴随着wordpress的经常升级和主题的升级以及更换,有时候后台会发现没有链接管理的入口,不过还是可以通过代码还原这个功能. 将以下代码添加到您当前 ...

  2. Filecoin官方更新: Q4工作进展和2018年工作计划

    ICO过后,Filecoin团队一直没有对外更新过工作计划(很多投资人都等待的不耐烦了).经过漫长的等待,在新年的第一个工作日,我们终于等来了来自于filecoin团队的声音, 这次更新真是出乎小编的 ...

  3. 如何写对kubernetes的模板文件

    kubernetes的模板配置文件随着版本更迭也会有相应的调整,正确配置模板关键字的方式是参考版本发布的doc,如下图 在docs\api-reference下面有不同功能的API目录,如下图 各个A ...

  4. Ubuntu16.04 中 Vscode 如何断点调试C语言程序

    个人博客链接:Ubuntu16.04 中 Vscode 如何断点调试C语言程序 问题:环境是 Ubuntu16.04,如何使用 Vscode 断点调试C语言程序. 写代码没有调试环境是不能忍受的,所以 ...

  5. linux性能调试之vmstat

    linux性能监控调优工具vmstat: vmstat:用于监控.显示系统运行过程中的虚拟内存/CPU/磁盘状态. 简单示例(时间间隔2s,监控2次): 重要字段解释: r 表示运行队列(等待运行的进 ...

  6. [POJ1631] nlogn求LIS

    用到了algorithm自带的lower_bound函数进行二分查找 #include<cstdio> #include<cstring> #include<algori ...

  7. Microsoft AI - Custom Vision in C#

    概述 前面一篇 Microsoft AI - Custom Vision 中,我们介绍了 Azure 认知服务中的自定义影像服务:Custom Vision,也介绍了如果通过这个在线服务,可视化的完成 ...

  8. C++基于范围循环(range-based for loop)的陷阱

    C++的基于范围的循环是C++11出现的新特性,很方便,一定程度上替代了使用迭代器的for循环用法.不过基于范围的for循环有一个隐藏的陷阱,如果不注意可能会出现严重的内存错误. 举例说明 看下面这个 ...

  9. linux利用ssh远程执行多台机器执行同样的命令

    这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下 ssh执行远程操作命令格式代码如下: ssh -t ...

  10. STL --> deque双向队列

    deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,de ...