TCP的三次握手和四次挥手

一、TCP协议简介

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,通过三次握手建立连接,通讯完成时要拆除连接。由于TCP是面向连接的,所以只能用于端到端的通讯。

二、TCP协议头部的格式:

三、TCP连接建立:

第一次握手:首先,客户端向服务端发送连接请求SYN报文。标志位SYN置为1,序号(随机)为j,即SYN=1 seq=j 。客户端进入SYN_SENT状态。

第二次握手:服务器接收到SYN报文后,发送SYN+ACK报文。将标志位的SYN和ACK都置为1,并将序号置为k,确认号置为j+1。即 SYN=1 ACK=1 seq=k ack=j+1 。服务器进入SYN_RECV状态。

第三次握手:客户端接收到SYN+ACK报文后,检查ACK与ack。检查无误,向服务器发送ACK报文,将标志位ACK置为1,确认号为k+1,即 ACK=1 ack=k+1。服务器接收到后,检查ACK与ack。检查无误,客户端和服务器进入ESTABLISHED状态,完成三次握手,建立TCP连接,开始传输数据。

简略版:
客户端:让我们建立连接吧!服务端!
服务端:好的客户端我收到了你发送的信息!让我们建立连接吧!
客户端:知道了服务端,我也能收到你发送的信息!
服务器得知客户端能接受到自己发送的信息,连接建立。

Read More

关于获取元素尺寸和位置属性的总结

正在写一个飞机大战的小游戏,编写过程中发现一个小问题:当获取隐藏元素尺寸时,offsetWidth与offsetHeight属性无效。研究一番,发现原来是由于这两个属性是元素通过css渲染到页面上时才计算的,而display:none的隐藏元素不参与渲染,因此无法获取尺寸。解决方法很简单,使用height:0px来隐藏元素即可。
趁此机会,总结一下几个易混淆的用于获取元素尺寸和位置的属性。

偏移量(offset dimension)

偏移量包括元素在屏幕上占用的所有可见空间,包括所有内边距、滚动条和边框大小。只读。
offsetHeight:元素在垂直方向占用空间大小。包括元素内容区高度、上下内边距高度、(可见)水平滚动条高度和上下边框高度。
offsetWidth:元素在水平方向占用空间大小。包括元素区宽度、左右内边距宽度、(可见)垂直滚动条的宽度和左右边框的宽度。
offsetLeft:元素的左外边框距离定位父元素(保存在offsetParent属性中)的距离。
offsetTop:元素的上外边框距离定位元素(保存在offsetParent属性中)的距离。

offsetParent属性的值:
(规律适用范围:table和内嵌框架布局页面除外的简单css布局页面)
1.如果有已定位(position属性不为static)的父元素,offsetParent属性的值是经过定位的这个父元素。
2.如果没有已定位的父元素,且元素自身position属性不为fixed,offsetParent属性的值是body。
3.如果元素本身使用了fixed进行定位,offsetParent属性值为null,这是因为fixed是相对视口定位,无定位父元素(但在Firefox中返回body)。

Read More

DNS解析过程简述

从输入网址到网页呈现,第一步就是通过DNS该网址解析成IP地址。

1.首先,浏览器会查询缓存中是否有与该域名对应的IP地址,如果有,解析结束。
2.如果在浏览器缓存中查找不到,浏览器会查询操作系统缓存是否有与该域名对应的IP地址,如果有,解析结束。
3.如果在操作系统缓存中也查找不到,浏览器向本地DNS服务器发起解析请求,解析程序把待解析的域名放在DNS请求报文中,以UDP用户数据的方式发给本地DNS服务器,进行递归查询。
4.本地DNS服务器收到请求后,先查询本地缓存,如果查找到与该域名对应的IP地址,直接将查询结果返回。
5.如果本地DNS服务器中没有对应的记录,本地DNS服务器便会发起迭代查询,首先查询根域名服务器。
6.根域名服务器返回给本地DNS服务器包含下一级域名的DNS服务器的IP地址,本地DNS服务器根据这个IP地址访问下一级DNS服务器,再得到下一级域名的信息的DNS服务器地址。
7.按上述方法迭代查询。直到在含有目标域名的DNS服务器上找到相对应的IP地址。
8.本地DNS服务器缓存域名与IP地址的对应关系(缓存时间由TTL值控制),并将查询结果返回浏览器。
9.浏览器根据IP地址访问目标主机,并将域名与IP地址的对应关系保存在缓存中(缓存时间由TTL值控制)。

JS中this对象指向总结

在js中,每个函数在被调用时,会产生两个变量,this和arguments。这意味着,只有在函数调用之时,this的指向才能确定。

this在运行时是根据执行环境绑定的,主要分为以下六种情况:
当包含this的函数:
1.作为普通的全局函数调用:在全局函数中,this指向window。
2.作为对象的方法调用:在函数被作为某个对象的方法调用时,this指向那个对象。
3.作为构造函数调用:当函数为构造函数,此时this指向实例出来的对象。
4.被apply,bind,call等改变执行环境时,this指向其他对象。
5.是匿名函数,this永远指向window(在不改变执行环境的情况下)。
6.其他情况。

注意:无论那种情况,this的指向都遵循着根据执行环境绑定的规律。
下面进行详细说明:

一、作为普通全局函数调用

看一个栗子。

1
2
3
4
5
var name='w';
function a(){
console.log(this.name);
};
a();//'w'

此时,函数a作为普通的全局函数调用,形式为函数名加括号,这种调用方法最常见,在这里,函数a中this指向window。

Read More

JS闭包及应用

定义:闭包是有权访问另一函数作用域的变量的函数。
常见创建闭包的方式:在一个函数内部创建另一个函数。

1
2
3
4
5
6
function sayHi(str){
var hello = "hello";
return function(){
alert(hello+str);
}
}

Read More