上图描述了应用数据从计算机A到计算机B的大致流程.图中网络传输这一步将是我们着重将要讨论的部分.网络可以大体分为网络协议与网络物理设备.
计算机之间的通信有一套标准规则才能够进行通信,这一套标准规则称之为互联网协议.从不同的角度分为如下几种
每一层常用的设备对应关系如下
功能:为数据端设备提供传送数据通路、传输数据。说白了就是给数据链路层传送和接收比特流.让数据链路层安心的处理比特流,不同媒体之间的通信我帮你搞好了兄弟.
分为两个部分:介质和标准[协议].
标准:定义了计算机传输的协议标准.离我们最近类似注入网线的接入标准.568B等.规定网线中电压的处理范围等.
介质:网卡,光纤,有线[双绞线,电缆],无线[wifi],卫星等.
传输方式:数字信号[比特流],模拟信号[用以在有线中传输的信号].数字信号到模拟信号的过程.称之为调制.
例如咱们常用的modem.
在物理层获取了比特流数据之后,数据链路层封装了以太网的通信协议.将比特流分组后获取数据帧.
数据帧则分为:head.data.两个部分.
封装了发送者,接受者的mac地址.数据的类型.共18字节.
从46字节到1500字节.携带了本次通信的数据.超过后则分片处理.
总结下功能:解析和封装了比特流数据[定义了以太网协议],用以在不同pc机之间通信.
有了pc机之间的mac地址,就可以完成pc之间的通信了.发送者会将自己的数据通过广播的方式在网络中广播出去.网络中的pc接收到数据后判断head中的mac地址是否是自己.不是则直接丢弃不处理.是则接收进行处理.类似村口大喇叭.王二到村委会报到.是王二才会去.但是问题随着也来了,随着网络pc机越来越多这种方式从效率来说太恶心了.下面网络层则是来解决这个问题
如果能够将网络分为一个个小的网络范围,网络内部通过广播的方式来处理.会不会好点.而网络之间通过路由方式来进行串联.网络地址就是这样一个能够区分pc是否在同一局域网的东西.
IP
分为两个部分网络部分,主机部分.取值范围0.0.0.0-255.255.255.0.
子网掩码
形式上和IP地址.不同的是根据IP地址.网络部分全部为1.主机部分为0.例如IP前24位为网络部分,后8位为主机部分,那么子网掩码为255.255.255.0.通过IP地址和子网掩码进行与运算得到的结果如果是相同的那么就认为这两个ip是在同一个局域网内.反之则通过路由进行广播外的通信转发.
经过了千辛万苦.物理层帮我们处理得到了统一的比特流.数据链路层帮我们封装了以太网的通信协议解决了通信问题.网络层解决广播的问题.这时候数据来到了PC了.终于到了.这时候我们发现PC机上也有很多的应用.QQ,微信,优酷,邮件.而端口就是用来标识应用的编号.传输层则是用来建立端口和端口之间连接的通信.而TCP.UDP则是具体这些通信的协议.
端口取值范围:0-65535.
定义:transmission control protocol .传输控制协议.
长度:理论无限长.但为了保证在IP协议传输下.不被分片.则不超过IP数据包长度.
在说明三次握手之前需要了解的是本次握手的意义是什么.握手的意义在于建立客户端和服务端链接.链接的需要保证的是两点:
我们需要把握这两个点来看这个流程.那么具体SYN是多少就没那么重要的.技术源于生活.
第一步:客户端发送SYN=1.进入SYN_SENT状态.这一步确认客户端发送正常.seq=x.
第二步:服务器接收.ack=x+1.同时发送服务器的数据包.syn=1.ack=1标识收到客户端发送包.这一步确认了
服务器发送和接收正常.seq=y.服务器进入syn_rec状态.
第三部:客户端seq=x+1.ack=y+1.seq=x+1.这一步确认了客户端接收正常.客户端和服务器都进入establish状态
印证上面的两个点.
四次挥手也是同样的道理需要确认四次挥手的意义是什么.四次挥手保证两点
1.客户端关闭接收,关闭通道;接收完数据
2.服务器发送完数据;关闭接收,发送通过
客户端发送释放连接报文.fin=1.seq=m(具体为服务器上次发送过来的数据+1).客户端进入fin_wait1状态.
服务器接收到关闭请求,发出确认.[好的我知道了你要关闭了也不会发送数据了]ack=1,seq=m+1.进入
close_wait.客户端收到后这时候就不会发送数据.发送通道关闭.但是这时候接收通道仍然需要接收服务器数据.
处于半关闭状态.
服务器在最后的数据发送后.告诉客户端我好了没有数据了.fin=1,seq=n.我也要关闭了.这时候服务器发送通道关闭
接收通道未关闭.
客户端收到服务器的释放连接后.[好的我知道了你也要关闭了,也没有货要发了].那客户端发送ack后
服务器马上关闭.但是客户端这时候不会马上关闭.在等待两个最长的报文通信时长后.客户端也关闭.
问题:为什么客户端需要等待两个msl后才会关闭?
原因:
1.由于ip报文的不可靠性.服务器可能不会收到客户端的ack确认,这时候服务器可能会发二次重试的fin进行客户端确认.
这时候如果客户端关闭.就无法进行接收和二次确认.这时候服务器就会报错了.两个的msl的时长会解决这些遗留问题.
协助服务器链接正常关闭.
2.另外一个原因,当马上关闭.这时候马上建立起的连接可能会沿用上次的端口.在上次数据没有完全释放清理的情况下到达服务器会出现和预期不一致的结果.
数据在经过TCP或者UDP协议包装之后还没有到达我们的应用层.这时候轮到Socket上场为我们获取TCP不同
进程的数据进行网络通信.如下图.Socket层为一层抽象不真实存在,从上面的描述也能知道socket仅
位于应用层和传输层之间.
数据在物理层处理之后获取标准的比特流.到达数据链路层通过以太网协议包装为以太网数据包.为了解决在 庞大的数据网通信的问题.引入网络层,网络地址,子网掩码,IP地址等概念解决广播问题.数据到达pc机之后 为了解决pc各个进程的网络通信问题引入了TCP协议,端口等保证pc间进程进行通信.
然后我们又了解了TCP的三次握手,四次挥手.以及后续简单看了下Socket在网络通信中的位置和意义.