OSI参考模型   与  TCP/IP模型

应用层    -  >   应用层

表示层

会话层

 

传输层  ->   传输层

 

数据链路层    ->  网络接口层

物理层

一般主要考察TCP/IP,因为TCP/IP才是常用的,OSI只是理想上

 

各层设备及传输单位

物理层:中继器    集线器      单位:bit流

数据链路层:网桥   交换机  网卡    单位:帧

网络层:路由器   三层交换机    单位:包

传输层及以上: 网关        单位: 段

 

 

TCP 与 UDP

UDP:udp提供数据报服务,面向无连接的,他的数据不保证顺序发送,他的传输速度比较快,并且可以同时建立多个连接,但是容易丢包并且没有应对措施,不安全不可靠,应用于实时性比较强的场合,如流媒体,还有广播

TCP:tcp提供可靠传输,速度比较慢,比UDP多了三次握手的过程,还有他的功能,流量控制,拥塞控制,路由选择,会考虑当前网络环境的好坏,如果网络差,会为了防止丢包而暂缓发送数据,所以会比UDP慢上很多,按顺序发送,但是不一定是按顺序到达

 

 

TCP的建立连接与终止(重中之重

TCP建立连接调用函数步骤

1,服务器端调用socket()连接

2,服务器端调用bind()指定服务端口

3,服务器端调用listen()等待监听客户端的到来

4,客户端调用socket()建立连接

5,客户端调用connect()主动连接服务器端,(注意,三次握手操作也是这里执行的,但是并不是由这个函数完成,这个只是去通知linux内核,让内核去实现三次握手)

6,服务器端调用acept()进行完成连接

7,相互通信传数据

8,客户端close(),完成结束

 

三次握手

注意名词含义

syn  代表一串序列号,连接请求和连接接受的报文

ack  对发送来的报文进行确认,给予的答复

fin   终止连接的请求

 

步骤:

1,客户端发送syn k给服务器端

2,服务器端发送 带ack k+1的syn j给服务器端

3,客户端发送 ack j+1给服务器端

通俗来说

1,客户端和服务器说   “我想和你连接”

2,服务器和客户端   “好,我收到你的消息了,我同意,你听到我说的话后回我一声”

3,客户端和服务器   “ok,我收到了”

 

为什么不可以两次连接而要三次?

答:因为如果两次连接的话,客户端发送的syn可能因为网络延迟还没到,客户端然后超时重传了一下,服务器和它连接后,如果后面收到之前那个syn包,就需要去向客户端确认一下,如果是两次连接,服务器端就会一直等待客户端发送数据,造成一个空连接浪费资源

 

四次挥手

步骤:

1,客户端发送fin给服务器

2,服务器发送ack给客户端

3,服务器发送fin给客户端

4,客户端发送ack给服务器

通俗来说

1,客户端和服务器说  "我东西传完了,我想关了"

2,服务器和客户端     “稍等一下,我东西还没传完”

3,服务器和客户端     “我东西传完了,收到消息请回复”

4,客户端和服务器      “ok,收到了”

 

特别说一下,可能会出现三次挥手的情况,就是当正好服务器端的数据也正好传完了,这个时候服务器可以把ack 和  syn同时发送给客户端

还提一下,为什么每次一端发送有用的信息都必须回复一下,因为如果你不回复,另一端就会认为是不是在中途丢包,你没接收到,然后就会重传,直到回复为止,这也是为了确认是否知道了消息

  

 

连接时的状态

三次握手

 1,客户端发送syn 给服务器       进入  syn_sent  状态

2,服务器之前是listen 状态   收到syn后  发送  带ack的 syn  进入  syn_rcvd

3,  客户端 发送ack给服务器   进入established(连接,这个状态才可以传收数据)

4,服务器收到ack  进入  established

四次挥手

5,客户端发送FIN     进入  fin_wait1

6,  服务器回复 ack   进入close_wait   客户端进入 fin_wait2

7, 服务器发送  fin  进入last_ack

8,客户端收到进入time_wait  并且回复ack

9,服务器收到 进入closed

 

time_wait状态存在的理由?(存活时间2MSL)

1,防止发送的ack包没有到达,这个时候服务器没收到会重新发送syn来,如果直接断开就没搞头了

2,让外面的超时节点死掉,因为每个包都有自己的存活时间MSL,因为如果之前网络有问题,然后超时重发,重新建立连接,但是网络一好就会有重复包出现,这个时间这个状态存在,可能等过了他的存活时间再发送,因为time_wait状态时间是2MSL

为什么是2MSL呢,因为 服务器-syn-客户端  一个MSL     客户端-ack-服务器   一个MSL

 

 

 

 其他不怎么重要和比较基础就不写了(懒 >_<)