网络五层模型

TCP/IP五层模型

应用层:

HTTP,HTTPS协议,其中HTTP没有对数据进行加密操作,但是HTTPS对数据进行了加密操作
其中HTTP端口号一般是80/8080等等,HTTPS端口号是443,SSH端口号一般是22,ftp是21
HTTP协议报头:

首行:请求方法,url,协议版本
请求报头:
HOST:主机
Connection:长连接还是短连接
Content-Length:标示body的长度
Accept-Encoding:客户告诉服务器编码类型和语言类型
Cookie:在客户端保存少量信息,实现会话的功能
空行
body

传输层:

UDP协议:

UDP报头格式

16位源端口号                  16位目的端口号
16位UDP长度                   16位UDP检验和(保证基本的数据正确性数据可以丢失,但不能把错的                       数据传给应用层)
数据

UDP的特点:
无连接:知道对方的的IP和端口号就直接进行发送数据,不管对方有没有连接
面向数据报:不管应用层给自己交付的报文长度是多少都不会进行组装和拆分,假如发送方一次发送了100个字节,那么接收方也必须对接受的数据一次性接受100字节
不可靠传输:UDP没有实现确认机制和重传机制,因此如果数据发生丢失则不会告诉给上层的应用层
UDP的缓冲区
UDP是调用sendto将数据直接交给内核,内核将数据交给网络层协议进行后续传输动作,UDP有接受缓冲区,当数据在接收方的缓冲区已经满的时候,此时如果再给对方进行数据发送,数据就会丢失
UDP是基于全双工的,通信双方既可以读,也可以写
UDP传输数据
UDP在传输数据的时候最大长度是16位,也就是在传输的过程中最大长度就是64K,如果传输裹过程中数据大于64K,此时就需要应用层将数据进行分包,在到达对方的时候进行解包

TCP协议

HTTP协议报头:

16位源端口号                              16位目的端口号
32位序列号
32位确认序列号
4位首部长度      保留6位        标识位     16位窗口大小
16位检验和                                16位紧急指针
选项
数据

其中16位的源端口号表示的是来自上层协议中的那个进程,目的端口号表示要交给接受端那个进程.32位序列号和确认序列号保证数据的请求和应答的正确性.同时也可以保证数据的按需到达,由于序列号和序列号也保证了数据的重传机制,也不用再担心丢包问题

TCP建立连接和释放连接

连接的建立:
客户端向服务器端发送一个SYN请求报文,此时客户端进入SYN_SEND状态,服务器接收到这个数据之后给客户端发送一个ACK确认应答报文,表示自己也已经收到客户端的SYN报文,同时也会发送一个SYN请求报文,同时服务器进入SYN_RECV状态,此时当客户端接收到这个报文之后给服务器端发送一个ACK,此时客户端进入ESTABLISHED,服务器接收到这个报文之后也会进入ESTABLISHED状态
为什么要进行三次握手,为什么要等待2*MSL
假如只有两次握手,服务器放给客户端的确认信号丢失,此时客户端会认为服务器端没有接受到自己的报文,于是不停给服务器发送无效的报文,势必造成服务器的负担
在进行四次握手的时候,当客户端给服务器发送的最后一个报文ACK丢失,此时服务器端没有接受到客户机的ACK,此时他会给服务器发送一个FIN,服务器接收到这个FIN后对客户端进行确认应答,发送一个ACK,此时两次下来刚好就是2*MSL

TCP保证可靠性的传输手段

确认应答

客户端每次给服务器发送SYN,服务器给客户端发送的ACK,同时将自己的应答信号也会带着给发送过去,从而保证了客户端请求,服务器端应答机制,而TCP报头中刚好有序号和确认序号,从而保证了可靠性传输

超时重传

当主机A给主机B发送一个数据的时候,此时由于网络的原因造成主机B发送给主机B的确认应答报文丢失,主机B会受到大量的重复的报文,此时主机A会等待特定时间,最后直到最大时间内还没有受到主机B发送给自己的确认应答的时候,此时就会认为对方已经断开连接,于是主机A会强制关闭连接

流量控制

在TCP报头中包括了一个窗口大小的字段用来表示自己可以接收的最大报文数量.当主机A向主机B发送一个报文的时候,每次都会看一下主机B的接受窗口,主机B接收到主机A发送给自己的数据之后,此时会将自己的接受窗口写入到TCP报头中窗口字段中,A接受到主机B发送给自己的报文之后,首先先看一下对方窗口大小,如果这个窗口大小比较小了,此时主机A会加快自己发送速度,如果发现接受方的接受窗口比较小的时候,此时就会减慢自己的发送速度,当发现对方的接受窗口为0的时候,此时就会停止自己发送报文.当过一段时间的时候,此时发送方A会给接收方B发送探测数据,以便知道对方的接受窗口的大小

拥塞控制

网卡罗上连接了许多的数据,如果一开始的时候各个主机直接给网络发送很多的数据,此时势必会造成网络拥塞.TCP规定了一个拥塞窗口,表示当前网络能够接受的做大数据,每次发送方在发送的时候都会将对方的窗口大小和拥塞窗口进行比较,将较小的数据作为自己的发送窗口.
同时在发送的时候规定拥塞窗口大小为1,每接收到一个应答便将拥塞窗口加1,当拥塞窗口的大小大于一个阀值的时候,此时将变为线性增长,同时每次超时重传的时候阀值会降为原来的一半.同时将硬塞窗口变为1

TCP保证性能传输

滑动窗口

滑动窗口左边表示的是已经确认过的,滑动窗口内表示的是已经发出去,但是没有进行确认的,滑动窗口右边的表示的是未发送的数据

延迟应答

接受方接受到数据后先不对发送方进行确认,经过一段时间后才对对方发送的数据进行一起确认.

捎带应答

每次接收方在对对方的发送数据进行确认的时候,此时也将自己需要发送给接受方的数据也全部发送给接收方

TCP和UDP的区别

TCP是面向字节流的,一次读取多少由系统去界定
UDP是面向数据报的,发送和接受的时候必须按一定的大小进行发送和接受,不能对数据进行封装以及拆分
TCP是保证可靠性的,它为了实现可靠性采用了超时重传,确认应答,流浪控制,拥塞控制等手段,同时为了实现性能可靠性,TCP采用了滑动窗口,捎带应答,延迟应答等等机制
UDP没有实现可靠性,它在发送的过程中如果数据发生了丢失,此时就需要上层去确认重传机制
TCP主要使用与一些可靠传输场景,比如文件传输等等,但是它实现复杂,传输速度较为慢,UDP主要适用于对速度要求较高的场景,比如视频的传输等等

网络层

为什么要有网络?
之所以要有网络层,是因为数据在发送方传输层的时候只有自己的源端口和目标端口,但是不知道对方的IP以及数据应该如何到达对方的目的端口都是不知道的,有了网络层,此时加上路由器就会将数据从远端通过路由转发算法对其进行转发,一直到达对方所在的局域网
数据从上层的传输层传下来的时候,此时山层协议有很多,为了区分数据来自上层的哪个协议此时就在IP层的报头中添加了一个8位协议,表示自己接受的数据来自上层协议的那个协议,同时在IP层也有对应的IPV4和IPV6,为了区别两者,也就增加了一个4位版本,同时由于数据进行了封装,那么如和区别自己是正文还是报头信息,此时就需要将自己的数据进行区分,于是便有了首部长度这个字段(4位),同时也有一个8位服务类型,同时16位的总长度表示数据段加上首部整体的长度,由于数据来自上层,有可能数据太大了,于是就需要将数据进行分片,来自上层的同一个数据在经过分片后它的标识是一样的,但是为了防止在IP层对数据进行胡乱的分片,此时就有了3位的表示字段表示是否允许分片.同时既然进行了分片,此时接受方接受到数据后就要进行组装,在进行组装的时候肯定要知道那个数据在前,那个数据在后,于是就需要一个片偏移表示数据的位置,同时在IP层数据要进行路由转发,于是每一个数据都得有自己的一个生存时间,同时也得对首部信息进行校验.既然进行路由转发,此时就需要知道源IP,目的IP,同时也有选项字段(最多40)字节

4位版本            4位首部长度      8位服务类型          16位总长度
16位标识符                  3位标识             13位的片偏移
8位生存时间                  8位协议            16位首部校验和32位源IP地址32位的目的IP地址选项数据

网段划分

为什么要有网段划分:
之所以要有网段划分是因为网络中有很多的主机,而在这么多的主机中要去找一个主机,那可能会耗费大量的人力物力,所以为了方便找到网络中的每一个主机
IP包括网络号和主机号,其中网络号是为了保证两个网段具有不同的标识,端口号是为了保证在同一个网络之间的主机有不同的标识
其中同一个子网中的主机之间网络号相同,主机号不同

ICMP

和IP相同的是ICMP也是工作在网络层的,但是ICMP不能保证数据是否成功到达对方,而ICMP可以确认数据是否成功到达对方,同时在进行返回的时候会通知IP报被对其的原因,虽然ICMP只能针对IPV4进行使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的静态成员函数指针

http://blog.csdn.net/sky453589103/article/details/47276789 先简单的说说非静态的成员函数。非静态成员函数指针的类型:类的非静态成员是和类的对象相关的。也就是说,要通过类的对象来访问变量。成员函数的类型定义为:typedef void (A::*p…

从一个字符串中删除另一个字符串中出现过的字符

http://blog.csdn.net/walkerkalr/article/details/39001155 定义一个函数,输入两个字符串,从第一个字符串中删除在第二个中出现过的所偶字符串。例如从第一个字符串"We are students."中删除第二个字符中“auiou”中出现过的字符得到的结果是…

SPOJ-VLATTICE Visible Lattice Points-莫比乌斯反演

需要将问题分解一下。 我们需要求的是这个立方体从(0,0,0)能看到的点的个数。可是在三个含有(0,0,0)的面上我们没有办法和其他的一起进行分析(因为含有坐标是0,而我们的数论工具都是从1开始的),所以我们可以将那三个面分开考虑&a…

进程的通信

管道 什么是管道 由于进程之间是相互独立的,因此在进程与进程之间进行相互联系的时候,此时就需要采用一种机制,通过管道的方式将进程一个进程的执行数据交给另外一个进程,此时就可以以通过管道来实现 匿名管道和命名管道 匿名管道 创建一个匿名管道的方式是pipe(int pipe[…

获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf

http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq 结构体struct ifconf来获取网络接口的各种信息。 ioctl 首先看ioctl()用法ioctl()原型如下&#xff1a;#include <sys/ioctl.h>int ioctl(int fd, i…

欧拉降幂

我们记f(n)为n的欧拉函数值&#xff0c;则 当B>f©时&#xff0c;AB%CAB%f©f©%C&#xff0c;这里A,C可能不互质。 很好用&#xff0c;证明很复杂&#xff0c;等有时间回来学习一下。

房多多面试总结

测试一个ATM机 功能上 取钱     正常         要取的钱的面值是否支持ATM机服务         要取的钱的数目是否小于等于存的钱的数目         要取的钱的数目大于存钱的数目     异常         取钱的时候操作出现异常&#xff0c;导致…

BZOJ3884上帝与集合的正确用法-欧拉函数

刚开始我想的是欧拉降幂&#xff0c;可是觉得复杂度还是挺高的就去找了一下题解。 思路大方向没有问题&#xff0c;仍然是使用欧拉函数降低指数然后递归处理。但是不是简单的使用欧拉降幂而是应该对模数p稍微处理一下。因为底数已经确定为2&#xff0c;所以我们可以将p写成p2k…

比较ArrayList和数组的区别

区别1:创建时的区别 一般数组在创建的时候都需要指定数组的大小&#xff0c;但是ArrayList不需要指定数组的大小 //创建一个ArrayList对象 ArrayList<String> myList new ArrayList<String>(); //创建一个数组 String [] myList new String[2];区别2&#xff1…

linux C如何获取服务器节点上所有网口的ip地址

http://blog.csdn.net/weiyuefei/article/details/22198659 之前项目原因&#xff0c;需要获取当前服务器节点上所有网口的ip地址&#xff0c;但是当时由于时间比较紧&#xff0c;一直没搞出来&#xff0c;最近没那么忙了&#xff0c;又在网上找了一下&#xff0c;终于实现了这…

HDU1573-模线性方程

模线性方程的模板题。&#xff08;卡了一会&#xff0c;发现读入弄错了&#xff09; #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cmath> #include<cstdlib> #include<ctime> #include<…

java中引用传递

基本概念 栈内存 所谓的栈内存就是存储进程在运行过程中变量的内存空间 堆内存 所谓的堆内存就是存储系统中数据的内存空间 数组相关的引用传递 先来看一段代码 public class ArrayDemo {public static void main(String[] args) {int[] x null;x new int[3];System.o…

(原创)C++11改进我们的程序之右值引用

http://www.cnblogs.com/qicosmos/p/3369940.html 本次主要讲c11中的右值引用&#xff0c;后面还会讲到右值引用如何结合std::move优化我们的程序。 c11增加了一个新的类型&#xff0c;称作右值引用(R-value reference)&#xff0c;标记为T &&&#xff0c;说到右值引用…

(原创)C++11改进我们的程序之move和完美转发

http://www.cnblogs.com/qicosmos/p/3376241.html 本次要讲的是右值引用相关的几个函数&#xff1a;std::move, std::forward和成员的emplace_back&#xff0c;通过这些函数我们可以避免不必要的拷贝&#xff0c;提高程序性能。move是将对象的状态或者所有权从一个对象转移到另…

微型个人博客服务器

Http相关简介 Http是应用层的基于请求响应的一个协议, 其中Http的请求响应可以分为四部分. 请求行, 请求报头,空行, 请求正文.其中请求行包括了请求方法, url, 版本号, 请求报头包括请求属性, 冒分割的键值对, 每组属性之间都以换行的形式分开, 最后一空行作为请求的结束标识.…

HDU6428-Calculate-数论函数

并不知道为什么同样一份代码早上超时下午就A了…好像数据是随机的? 做的第一道不是简单板题的数论函数题.果然做不出来… 在网上研究了好久,才算稍微研究明白.看到了两种推导的思路.(写了半天发现讲起来好麻烦,有时间再来更新) #include<cstdio> #include<cstring&g…

[C/C++]关于C++11中的std::move和std::forward

http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.htmlstd::move是一个用于提示优化的函数&#xff0c;过去的c98中&#xff0c;由于无法将作为右值的临时变量从左值当中区别出来&#xff0c;所以程序运行时有大量临时变量白白的创建后又立刻销毁&#xff0c;其中又尤其是返回…

BZOJ3930-莫比乌斯反演+杜教筛

题目的意思很简单&#xff0c;求给定区间内的gcdk的个数&#xff0c;这应该是传统的莫比乌斯反演了。 有两种思路&#xff0c;一种是直接将里面变成gcd1&#xff0c;然后里面看作元函数用莫比乌斯函数和恒等函数展开&#xff0c;然后改变求和顺序。 还有一种是构造两个函数&…

HDU1999不可摸数-暴力打表

看到这约数和第一反应是约数和函数&#xff0c;然后仔细一看不是正经的约数和函数&#xff0c;就去推去了&#xff0c;然后推的有点小复杂。&#xff08;数论函数那部分做多了&#xff09; 然后观察也没有用到什么数论部分的特殊知识啊&#xff0c;难不成真的要暴力&#xff1f…

BZOJ2818-莫比乌斯反演/欧拉函数

这道题之前没有看数论函数的时候搞懂了,想到直接用欧拉函数做,现在再来看第一个想法就是这不是莫比乌斯反演嘛. 但还是能用简单数论知识直接做出来的还是尽量做简单一点. 两种方法想到后都写的差不多对了,都爆long long 了.万恶的long long .实在是烦.切记切记,只要是乘积,或…