文章目录
- 计算机网络知识点总结(一)
计算机网络知识点总结(一)
1.网络体系结构
1.1介绍
我们把计算机网络的各层及协议集合,成为网络的体系结构。换种说法,计算机网络的体系结构就是这个计算机网络及其构件所应完成的功能的精确定义
层与协议:每一层都是为了完成一种功能,为了完成这些功能,需要遵循一些规则,这些规则就是协议,每一层都定义了一些协议
国际标准化组织ISO 于1981年正式推荐了一个网络系统结构—-七层参考模型,叫做开放系统互连模型(Open System Interconnection,OSI)。由于这个标准模型的建立,使得各种计算机网络向它靠拢,大大推动了网络通信的发展。
但由于OSI体系结构太复杂,在实际应用中TCP/IP的四层体系结构得到广泛应用,作为折中,在学习中一般学习五层协议体系机构。各体系结构如下图:
1.物理层 (physical layer)
在物理层上传输的数据单位是比特,物理层的任务就是透明的传输比特流。也就是说,发送方发送1(或0)时,接收方应当接收1(或0)而不是0(或1)。因此物理层要考虑的是多大的电流代表“1”或“0”,以及接收方如何识别发送方所发送的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各条引脚要如何连接。当然,哪几个比特代表什么意思,则不是物理层所需要管的。注意,传递信息的物理媒体,如双绞线、同轴电缆、光缆无线信道等,并不在物理层协议之内。
总结:规定了网络中的电气特性,负责传送0和1电气信号。
2.数据链路层(data link layer)
两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,两个相邻节点(主机和路由器之间或两个路由器之间)传送数据是直接传送的(点对点)。这是就需要专门的链路层协议。连个相邻节点之间传送数据时,数据链路层将网络层传下来的IP数据报组转城帧(framing),在连个相邻节点透明的传送帧(frame)中的数据。每帧中包含必要的控制信息(如同步信息、地址信息、差错控制等)。
以太网协议:以太网规定一组电信号组成帧,帧由标头(Head)和数据(Data)组成。
标头包含发送方和接收方的地址(MAC地址)以及数据类型等等。
数据则是数据的具体内容(IP数据包)。
MAC地址每个连入网络的设备都有网卡接口,每个网卡接口在出厂时都有一个独一无二的MAC地址。
通过ARP协议可以知道本网络内的所有机器的MAC地址,以太网通过广播的方式把数据发送到本网络内的所有机器上,让其根据MAC地址自己判断是否接受数据。
3.网络层
网络层负责为分组交换网上的不同主机提供服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。由于网络层使用IP协议,因此分组也叫做IP数据包,或简称数据报。
网络层的另一个任务就是选择合适的路由,是源主机运输层所传下来的分组,能够通过网络钟的路哟其找到目标主机。
因特网是一个很大的互联网,由大量的异构网络相互连接起来。因特网的主要网络层协议是无连接的网际层协议IP(Internat Protocol)和许多路由选择协议,因此网络层也叫做网际层或IP层。
依靠以太网的MAC地址发送数据,理论上可以跨地区寻址,但是以太网的广播方式发送数据,不仅效率低,而且局限在发送者所在的局域网。如果两台计算机不在一个子网内,广播是发不过去的。
因此有了网络层,它引入一种新的地址,使得能够区分两台计算机是否在同一个子网内,这套地址叫做网络地址,简称网址。
规定网络地址的协议叫IP协议,所定义的地址叫IP地址,由32个二进制位组成,从0.0.0.0一直到255.255.255.255。IP地址分为两个部分,前面一部分代表网络,后一部分代表主机。处于同一个子网的IP地址,其网络部分必定是相同的。例如前24位代表网络,后8位代表主机,IP地址172.251.23.17和172.251.23.108处在同一个子网。如何判断网络部分是多少位,这就需要子网掩码,它和IP地址都是32个二进制位,代表网络的部分都由1表示,主机部分位0。那么24位的网络地址,子网掩码就是255.255.255.0。将两个IP地址分别和其对应的子网掩码进行AND运算,结果相同说明两个IP在同一个子网络。
因此如果是同一个子网络,就采用广播方式发送,否则就采用”路由”方式发送。IP协议作用主要是为分配IP地址和判断那些IP在同一个网络。
4.运输层(transport layer)
运输层的任务就是负责两个主机进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能。复用就是多个应用进程可同时使用运输层的服务,分用是运输层把收到的信息分别交付给上面的应用层的相应进程。
运输层主要使用两种协议: TCP-面向连接的,UDP-无连接的。
计算机有许多需要网络的的程序,比如QQ、浏览器等,如何区分从网上来的数据是属于谁的,于是有了一个参数,这个参数叫做端口(PORT),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“端口”是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
“运输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做”套接字”(socket)。有了它,就可以进行网络应用程序开发了。
5.应用层(Application layer)
应用层是体系机构的最高层,应用层直接为用户提供进程服务。这里的进程值得就是正在运行的程序。应用层的协议很多,如HTTP、FTP、SMTP等。
应用程序收到”传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。
“应用层”的作用,就是规定应用程序的数据格式。
举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
1.2每层协议
物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器,网关)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
1.3每层作用
每一层的作用如下:
物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
物理层:底层数据传输,如网线;网卡标准。
数据链路层:定义数据的基本格式,如何传输,如何标识;如网卡MAC地址。
网络层:定义IP编址,定义路由功能;如不同设备的数据转发。
传输层:端到端传输数据的基本功能;如 TCP、UDP。
会话层:控制应用程序之间会话能力;如不同软件数据分发给不同软件。
表示层:数据格式标识,基本压缩加密功能。
应用层:各种应用软件,包括 Web 应用。
1.4运输层与网络层协议区别
网络层协议负责的是提供主机间的逻辑通信
运输层协议负责的是提供进程间的逻辑通信
1.5数据链路层协议可能提供的服务
成帧、链路访问、透明传输、可靠交付、流量控制、差错检测、差错纠正、半双工和全双工。最重要的是帧定界(成帧)、透明传输以及差错检测
2.TCP/IP4层协议体系结构
3. 五层协议体系结构
3.1 介绍
3.2物理层
3.3数据链路层
3.4网络层
不管是tcp还是udp, 都是一个四元组确定一个连接! 或许是书上阐述的不够详细的缘故导致题主有这样疑惑.
或许简单了解下网络层和传输层分别负责的工作, 可以帮助理解:
网络层: 目的是实现两个端系统之间的数据透明传送, 包括寻址和路由选择、连接的建立、保持和终止等.(主机与主机间)
报文在网络中传输, 路由器将根据ip头的目的ip, 为该报文选择合适的路由, 选择合适的线路, 来让其可以到达最终的目的主机. 就好比写信, 我写了一封信, 寄往xxx市yyy区zzz镇aaa号kkk人收,邮差就会根据前面的地址,将信派发到aaa号的地方, 在这里,邮差就相当于路由器,根据信上的地址, 来选址选方向, 网络层就是提供这样的服务,只要报文段是在网络层以上的, 它就会有这样的功能和义务. 每个ip地址,都是一个实实在在的个体, 是确切可以通信的.
传输层: 实现端到端的数据传输(程序与程序间)
接着上面的例子, 当邮差把信投递到aaa号, 他遍不管了,因为他不知道谁叫kkk,这时候谁来管? 肯定就是aaa号里面的人, 他知道kkk是谁, 所以他就直接把收到的信, 拿给kkk, 到了这一步, 整个通信才算完成, 因为kkk此刻才确切看到信(数据), 如果aaa地方里面, 有好几个叫kkk的人, 那这样就混乱了, 压根不知道给谁, 现实世界如此,在操作系统便是, 所以直接定义端口号不能重复.
所以总结的一点就是:
数据包中:
ip头部, 是为了让报文能够顺利从源主机, 到达目的主机
tcp/udp头部, 是为了让报文在目的主机, 能够正确被投递到正确的程序
但是不管是tcp还是udp, 他们都是四元组来确定一个连接, 他们的区别,更多是在于对连接管理方式而已, 包括可靠性,创建与销毁等等
3.5传输层
3.6应用层
3.7对应的网络协议
4.域名
4.1域名介绍
域名可以中文
4.2域名分类
顶级域名
国家域名可分为不同级别,包括顶级域名、二级域名,三级域名等。
1.顶级域名又分为两类:
(1)是国家顶级域名(national top-level domainnames,简称nTLDs),有200多个国家都按照ISO3166国家代码分配顶级域名,例如中国是cn,美国是us,日本是jp等;
(2)是国际顶级域名(international top-level domain names,简称iTDs)
如表示工商企业的 .com .top,表示网络提供商的.net,表示非盈利组织的.org等。
大多数域名争议都发生在com的顶级域名下,因为多数公司上网的目的都是为了赢利。
为加强域名管理,解决域名资源的紧张,Internet协会、Internet分址机构及世界知识产权组织(WIPO)等国际组织经过广泛协商, 在原来三个国际通用顶级域名:(com)的基础上,新增加了7个国际通用顶级域名:firm(公司企业)、store(销售公司或企业)、web(突出WWW活动的单位)、arts(突出文化、娱乐活动的单位)、rec (突出消遣、娱乐活动的单位)、info (提供信息服务的单位)、nom(个人),并在世界范围内选择新的注册机构来受理域名注册申请。
2.二级域名
二级域名是指顶级域名之下的域名;
(1)在国际顶级域名下,它是指域名注册人的网上名称,例如 ibm,yahoo,microsoft等;在国家顶级域名下,它是表示注册企业类别的符号,例如com,top,edu,gov,net等。
(2)我国在国际互联网络信息中心(Inter NIC) 正式注册并运行的顶级域名是CN,这也是我国的一级域名。在顶级域名之下,我国的二级域名又分为类别域名和行政区域名两类。类别域名共6个, 包括用于科研机构的ac;用于工商金融企业的com top;用于教育机构的edu;用于政府部门的 gov;用于互联网络信息中心和运行中心的net;用于非盈利组织的org。而行政区域名有34个,分别对应于我国各省、自治区和直辖市。
3.三级域名
三级域名用字母( A~Z,a~z,大小写等)、数字(0~9)和连接符(-)组成, 各级域名之间用实点(.)连接,三级域名的长度不能超过20个字符。 如无特殊原因,建议采用申请人的英文名(或者缩写)或者汉语拼音名 (或者缩写) 作为三级域名,以保持域名的清晰性和简洁性。
4.3www仅仅是域名
www仅仅是三级域名,不是什么特殊符号;
4.4专用地址
专用地址(private address)。此方法打破互联网上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
这就是网络地址转换NAT(Network Address Translation)方法了。它将专有地址转化为全球IP地址。而全球IP地址只有在局域网中的主机连入互联网时才由局域网接入互联网的路由器动态分配。但是为了最大限度的利用有限的全球IP地址,进化出了NAPT,把IP地址的端口号也利用上了
连入网络的手机或电脑看看IP地址,也是在这个范围内
5.IP地址分类
IP地址分为五类
*A类保留给政府机构(适用于大型网络)
*B类分配给中等规模的公司(适用于中型网络)
*C类分配给任何需要的人(适用于小型网络)
*D类用于组播(用于组播)
*E类用于实验(用于科研保留)
注:各类可容纳的地址数目不同
IP地址=网络地址+主机地址
网络地址 = IP地址 & 子网掩码(把IP地址转成二进制和子网掩码进行与运算,即两个都是1的话,结果才是1)
广播地址=网络地址 | (~子网掩码) (|:位或运算)
1个字节可表示的范围:0-255
1.A类地址:
*范围:0.0.0.0-127.255.255.255(其中:0代表任何地址; 127代表回环测试地址)
*实际范围:1.0.0.0--126.0.0.0
*10.X.X.X是私有地址(10.0.0.0---10.255.255.255)
*所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址
*127.X.X.X是保留地址,用作循环测试的
*当将IP地址写成二进制形式时,地址的第一位总是0(00000000=0,01111111=127)
*网络号第一位固定为0,网络号只有7位可以使用,可以指派的网络号是2^7-2 = 126个(01111111=127)
网络号全是0(0000 0000)的IP地址是保留地址,意思是“本网络”
网络号是127(0111 1111)的IP地址也是保留地址,作为本地环回软件测试
*主机号占3个字节,每个网络中的最大主机数是2^24-2个
主机号全是0的IP地址表示是“本主机”所连接到的单个网络
主机号全是1的IP地址表示是该网络上的所有主机
2.B类地址:
*范围:128.0.0.0-191.255.255.255
*实际范围:128.1.0.0-*191.254.0.0
*128.0.0.0与191.255.0.0是保留ip
*当将IP地址写成二进制形式时,地址的前两位总是10(10000000=128,10111111=191)
*可以指派的网络号是2^14-1个
B类地址网络号为10000000.00000000的IP地址是不指派的,所以可指派的网络号需要减一。
*每个网络中的最大主机数是2^16-2个。
主机号全是0的IP地址表示是“本主机”所连接到的单个网络
主机号全是1的IP地址表示是该网络上的所有主机
3.C类地址:
*范围:192.0.0.0-223.255.255.255
*实际范围:190.0.1.0--223.255.254.0
*192.0.0.0和223.255.255.0是保留ip
*当将IP地址写成二进制形式时,地址的前三位总是110(11000000=192,11011111=223)
*可以指派的网络号是2^21-1个
网络号为11000000.00000000.00000000)的IP地址是不指派的,所以可指派的网络号需要减一
4.D类地址:
5.E类地址:
子网掩码:
*介绍:子网掩码又叫网络掩码、地址掩码、子网络遮罩;
它是一种用来指明一个IP地址的哪些位 标识的是主机所在的子网,以及哪些位标识的是主机的位掩码;
子网掩码也是一个32位地址,只有一个作用
*作用:就是将某个IP地址划分成网络地址和主机地址两部分;
①通过子网掩码,就可以判断两个IP在不在一个局域网内部。
②子网掩码可以看出有多少位是网络号,有多少位是主机号
③其对应的IP地址中网络地址的所有位置都为1,对应于主机地址的所有位置都为0。
*每一类IP地址都有默认的子网掩码
对于A类地址来说,默认的子网掩码是255.0.0.0;(或者写255.0.0.0/8,即8个连续的1)
对于B类地址来说,默认的子网掩码是255.255.0.0;(或者写255.255.0.0/16)
对于C类地址来说,默认的子网掩码是255.255.255.0(或者写255.255.255.0/24)
广播地址(Broadcast Address):
是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。
6.端口
概念:
端口包括物理端口和逻辑端口。
物理端口是用于连接物理设备之间的接口,逻辑端口是逻辑上用于区分服务的端口。
TCP/IP协议中的端口就是逻辑端口,通过不同的逻辑端口来区分不同的服务。
一个IP地址的端口通过16bit进行编号,最多可以有65536个端口。
端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535 (2的16次方是65536)
端口号根据范围分为三种:
*Well-Known Ports(即公认端口号)
它是一些众人皆知著名的端口号,这些端口号固定分配给一些服务,我们上面提到的 HTTP 服务、 FTP服务等都属于这一类。知名端口号的范围是:0-1023
*Registered Ports(即注册端口)
*它是不可以动态调整的端口段,这些端口没有明确定义服务哪些特定的对象。不同的程序可以根据自己的需要自己定义,注册端口号的范围是:1024-49151
*Dynamic, private or ephemeral ports(即动态、私有或临时端口号)
顾名思义,这些端口号是不可以注册的,这一段的端口被用作一些私人的或者定制化的服务,当然也可以用来做动态端口服务,这一段的范围是:49152–65535
常用端口:
服务 端口号
FTP 21
SSH 22
telnet 23
SMTP 25
Domain 53
HTTP 80
POP3 110
NTP 123
MYSQL 3306
Shell cmd 514
POP-2 109
SQL Sever 1433
7.Http和Https的区别
Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
1.端口不同:Http与Https使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
2.资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
3.开销:Https通信需要证书,而证书一般需要向认证机构购买;
Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
8.TCP与UDP的区别
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议,它们之间的区别包括:
1)TCP是面向连接的,所谓面向连接就是双方传输数据之前,必须先建立一条通道,例如三次握手就是建议通道的一个过程,而四次挥手则是结束销毁通道的一个其中过程;UDP是无连接的传输层协议;
2)TCP是可靠的传输服务,即传送的数据无差错、不丢失、不重复、按序到达;UDP是不可靠的,UDP使用尽最大努力交付,不保证可靠交付;
3)TCP只支持点对点通信,即每一条TCP连接只能有两个端点(即两个套接字),只能是点对点的;UDP支持一对一、一对多、多对一、多对多的通信模式;
4)TCP是面向字节流的;
UDP是面向报文的,对应用层交下来的报文,不合并,不拆分,保留原报文的边界
5)TCP有拥塞控制机制,即TCP提供全双工通信,允许通信双方的应用进程在任何时候都可以发送数据,因为两端都设有发送缓存和接受缓存;UDP没有拥塞控制,因此即使网络出现拥塞也不会降低发送速率;
6)TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;
TCP的可靠性原理:
可靠传输有如下两个特点:
a.传输信道无差错,保证传输数据正确;
b.不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据;
(1)首先,采用三次握手来建立TCP连接,四次挥手来释放TCP连接,从而保证建立的传输信道是可靠的。
(2)其次,TCP采用了连续ARQ协议(回退N,Go-back-N;超时自动重传)来保证数据传输的正确性,使用滑动窗口协议来保证接方能够及时处理所接收到的数据,进行流量控制。
(3)最后,TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞。
9.基于TCP和UDP的常用协议
HTTP、HTTPS、FTP、TELNET、SMTP(简单邮件传输协议)协议基于可靠的TCP协议。TFTP、DNS、DHCP、TFTP、SNMP(简单网络管理协议)、RIP基于不可靠的UDP协议
10.TCP 和 UDP 应用场景
TCP应用场景:
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。
UDP应用场景:
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)
11.SSL
1.版本:当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输
2.作用:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变
3.定义
1)英文名:Secure Sockets Layer
2)中文名:安全套接字协议
3)应用:在传输层对网络连接进行加密
12.对称密钥加密与非对称密钥加密的区别
1.对称密钥加密:对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
2.非对称密钥加密:非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密;
3.区别:非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
13.Socket套接字
套接字(socket)为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个
通常,套接字采用客户机-服务器架构。服务器通过监听指定端口,来等待客户请求。服务器在收到请求后,接受来自客户套接字的连接,从而完成连接。
14.TCP协议定义
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,在连接双方发送数据之前,都需要首先建立一条连接
15.TCP报文
1、端口号:用来标识同一台计算机的不同的应用进程。
1)源端口:源端口和IP地址的作用是标识报文的返回地址。
2)目的端口:端口指明接收方计算机上的应用程序接口。
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
2.窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
3.校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
4.数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
5.保留:为将来定义新的用途保留,现在一般置0。
6.紧急指针:只有当 URG 标志置 1 时紧急指针才有效; 紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号; TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
7.选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
8.数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
16.TCP中的6种标识位
标志位也叫位码、也叫控制位
SYN (synchronous建立联机);也可以来理解成:同步序列编号(Synchronize Sequence Numbers)
ACK (acknowledgement 确认) ------大写ACK
PSH (push传送)
FIN (finish结束)
RST (reset重置)
URG (urgent紧急)
注意:大写ACK与小写ack是不一样的
SYN:SYN= 1 表示这是一个连接请求或连接接受报文。在建立连接时用来进行同步序号(个人理解是,在建立连接的时候,提醒对方记录本方的起始序号)。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若是同意建立连接,则应响应的报文段中使SYN=1、ACK=1。因此SYN=1表示该报文是一个连接请求报文或者是一个连接请求接收报文。
ACK:确认号只有在该位设置为1的时候才生效,当该位为0是表示确认号无效。TCP规定,在TCP连接建立后所有传送的数据报文段ACK都必须设置为1。
FIN:当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接
17.TCP中的序号
Sequence number (顺序号码)-------也叫序列号
占4个字节,它的范围在0-2^32-1,序号随着通信的进行不断的递增,当达到最大值的时候重新回到0在开始递;
TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号,整个要传送的字节流的起始号必须在连接建立时设置;
首部中的序列号字段指的是本报文段所发送的数据的第一个字节的序号;
例如:一个报文序号是301,而携带的数据共有100字节,则表示本次报文中的序号是301,下一个报文的序号是401,重复一下,每一个报文的序号是该报文包含的字节中第一个字节的编号
18.TCP中的确认号
Acknowledge number (确认号码) ------小写ack
占4个字节,确认号,是对下一个想要接受的字节的期望,这里隐式确认了对上一个数据包的成功接收。如上例,在成功接收了序号为301的数据包,想要接收下一个数据包因为上个数据包包含100字节,所以此时的确认号应该是401,表示希望接收下一个序号是401的数据包
19.TCP的11种状态
1.CLOSED:
初始状态,表示TCP连接是“关闭着的”或“未打开的”。
2.LISTEN:
表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
3.SYN_RCVD:
表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat很难看到这种状态,除非故意写一个监测程序,将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时,再收到客户端的ACK报文,它就会进入到ESTABLISHED 状态。
4.SYN_SENT:
这个状态与SYN_RCVD 状态相呼应,当客户端SOCKET执行connect()进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT 状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT 状态表示客户端已发送SYN报文。
5.ESTABLISHED:
表示TCP连接已经成功建立; 表示两台机器正在传输数据
6.FIN_WAIT_1 :
这个状态得好好解释一下,其实FIN_WAIT_1 和FIN_WAIT_2 两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1 状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2 状态。当然在实际的正常情况下,无论对方处于任何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1 状态一般是比较难见到的,而FIN_WAIT_2 状态有时仍可以用netstat看到
fin_wait1状态是在server端主动要求关闭tcp连接,并且主动发送fin以后,等待client端回复ack时候的状态
7.FIN_WAIT_2:
上面已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表示半连接,即有一方调用close()主动要求关闭连接。注意:FIN_WAIT_2 是没有超时的(不像TIME_WAIT 状态),这种状态下如果对方不关闭(不配合完成4次挥手过程),那这个 FIN_WAIT_2 状态将一直保持到系统重启,越来越多的FIN_WAIT_2 状态会导致内核crash。
8.TIME_WAIT:
表示收到了对方的FIN报文,并发送出了ACK报文。 TIME_WAIT状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED 可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(这种情况应该就是四次挥手变成三次挥手的那种情况)
9.CLOSING :
这种状态在实际情况中应该很少见,属于一种比较罕见的例外状态。正常情况下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING 状态表示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?那就是当双方几乎在同时close()一个SOCKET的话,就出现了双方同时发送FIN报文的情况,这是就会出现CLOSING 状态,表示双方都正在关闭SOCKET连接。
10.CLOSE_WAIT :
表示正在等待关闭。怎么理解呢?当对方close()一个SOCKET后发送FIN报文给自己,你的系统毫无疑问地将会回应一个ACK报文给对方,此时TCP连接则进入到CLOSE_WAIT状态。接下来呢,你需要检查自己是否还有数据要发送给对方,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即关闭自己到对方这个方向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。
11.LAST_ACK:
当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK 状态。当收到对方的ACK报文后,也就可以进入到CLOSED 可用状态了。
20.TCP三次握手过程
1.第一次握手:
Client将标志位SYN置为1;
主机A发送位码为SYN=1,ACK=0,随机产生seq number= j的数据包到服务器(TCP规定SYN=1时不能携带数据但要消耗一个序号);
Client进入SYN_SENT状态(即等待状态),主机B由A发送的SYN=1知道,A要求建立联机;
2.第二次握手:
Server收到数据包后由标志位SYN=1知道Client请求建立连接,主机B收到请求后要确认联机信息;
Server将标志位SYN和ACK都置为1;
向A发送ack number(=Client的seq+1=j+1)、及SYN=1,及ACK=1,随机产生seq=K的包并将该数据包发送给Client以确认连接请求;
3.第三次握手:主机B收到后确认收到的seq值与发送给A的seq+1是否相等和ack是否为1来判断连接是否建立成功。
Client收到确认后,检查ack是否为J+1,ACK是否为1;
如果正确Client将标志位ACK置为1;
如果正确Client会再发送ack number(=Server的seq+1=K+1)、ACK=1,并将该数据包发送给Server
Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
21.TCP四次挥手过程
定义:建立一个连接需要三次握手,而终止一个连接要经过四次挥手;这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力
刚开始双方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下
1.第一次挥手:
当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据)
Client发送一个FIN报文,用来关闭Client到Server的数据传送,报文中会指定一个序列号,即发出连接释放报文段(FIN=1,序号seq=u);
Client进入FIN_WAIT_1(终止等待1)状态
2.第二次挥手:
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v);
Server进入CLOSE_WAIT(关闭等待)状态;
此时TCP链接处于半关闭状态,客户端到服务端的连接释放,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收;
客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段
3.第三次挥手:
Server发送一个FIN,且指定一个序列号,用来关闭Server到Client的数据传送(和客户端的第一次挥手一样);
Server进入LAST_ACK状态。
4.第四次挥手:
Client进入TIME_WAIT状态, 等待 2MSL 时间;
Server进入CLOSED状态
附:在socket编程中,任何一方执行close()操作即可产生挥手操作
为什么要等待呢?
为了防止这种情况:A接到B的释放连接请求后会发送一个确认信息,但是如果这个确认信息丢了,也就是B没有收到确认释放连接,那么B就会重发一个释放连接请求,这时候A还处于TIME_WAIT状态,所以会再次发送一个确认信息。
为什么TIME_WAIT 状态还需要等2*MSL秒之后才能返回到CLOSED 状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。
22.TCP三次握手原因
1.第一次握手:客户端发送网络包,服务端收到了
根据第一次握手,服务端得出结论:客户端的发送能力、服务端的接收能力是正常的。
2.第二次握手:服务端发包,客户端收到了
根据第一次握手以及第二次握手,客户端能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的;
不过此时服务端并不能确认客户端的接收能力、以及服务端的发送能力是否正常
3.第三次握手:客户端发包,服务端收到了
根据第一次握手及第二次握手以及第三次握手,服务端能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常
为什么要进行三次握手(两次确认):
为什么A还要发送一侧确认呢?这主要是为了防止已失效的连接请求报文突然又传送到了B,因而产生错误。
所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况。A发出连接请求,但因连接请求丢失而未收到确认。于是A再次重传一次连接请求。后来收到了确认建立了连接。数据传输完毕后,就释放了连接。A供发送了两个连接请求的报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。
现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到B。本来这是一个已失效的报文段。但是B收到此失效的连接请求报文段后,就误认为是A有发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样拜拜浪费了。
采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。
另一种解释:
这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了”。这可视为对“三次握手”目的的另一种解答思路。
23.TCP三次握手能携带数据吗
答:其实第三次握手的时候,是可以携带数据的;但是,第一次、第二次握手不可以携带数据
原因:假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。
也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。
24.HTTP介绍
HTTP 协议一般指 HTTP(超文本传输协议):
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准
是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)