zoukankan      html  css  js  c++  java
  • OSI-传输层

    OSI-传输层

    端口号(2字节)

    SYN(1bit)

    ACK(1bit)

    会话多路复用(为什么一个IP地址可以做很多事情?)

    源端口地址可以不同

    五元组(世界上没有相同的2个五元组)

    源IP地址-目的IP地址-源端口号-目的端口号-协议号

    端口

    0-65535

    0-1023 知名端口号

    1024-65535

    系统部分应用使用的协议

    端口号 应用程序 中文名字 协议
    20/21 FTP 文件传输协议(传大文件的) TCP
    22 SSH 远程管理应用(安全,加密) TCP
    23 telent 远程管用协议(不安全) TCP
    25 SMTP 简单邮件传输协议(只管发邮件) TCP
    53 DNS 域名解析协议 UDP/TCP
    69 TFTP 传小文件的 UDP
    80 HTTP 超文本传输协议 TCP
    110 POP3 收邮件 TCP
    161/162 SNMP 网络管理协议 UDP
    179 BGP 外部网关路由协议 TCP
    443 HTTPS (HTTP+SSL)安全的http TCP
    520 RIP 动态路由协议 UDP
    521 RIPng 下一代动态路由协议 UDP

    TCP vs UDP

    UDP特点(基于数据报)
    1.无连接(只要知道发送的ip和端口就可以直接发送,即使对方不在线,也不用提前建立连接)

    2.不可靠(没有重传和确认机制,即使数据没有发送到对方也不会有任何反应)

    3.面向数据报(可以发空数据,即使是空数据也可以发送,其实他是给空数据也装上了报头,所以其实他不为空)

    4.简单快速

    5.有传输上限,64k

    6.首部开销小,8字节

    TCP(基于字节流)

    1.基于连接(3次握手,4次挥手)

    2.传输可靠(看下面)

    3.只能一对一通信

    4.首部最小20字节,最大60字节

    TCP的可靠性

    可靠性的基础

    1.数据传输是有序的

    2.数据传输是有确认机制的

    3.有数据重传机制

    4.可靠性的前提是建立一条连接

    TCP三次握手

    字段 含义
    URG 紧急指针是否有效。为1,表示某一位需要被优先处理
    ACK 确认号是否有效,一般置为1。
    PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
    RST 对方要求重新建立连接,复位。
    SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
    FIN 希望断开连接。

    1.第一次握手:Client想要和Sever建立连接,随机产生一个序列号seq=j,将标志位SYN置为1,并将数据包发送给Server,Clinet进入SYN_SENT状态,等待Sever确认。

    2.第二次握手:Sever收到数据包知道Client想要建立连接,SYN标志位置为1表示请求和对方建立连接,ACK标志位置为1表示同意建立连接,ack=J+1,client端的seq告诉你我要发数据了发x个,server端发送的x+1是告诉对方,你发的x个数据包我都收到了(确认作用),下次就从x+1开始发吧,发送自己随机产生的序列号seq=K,Server进入SYN_RCVD状态。(这部分原来是由两部分组成的,为了提高效率,把服务器确认连接,和服务器请求和客户端连接合二为一了)

    3.第三次握手:Client收到确认后,检查ack是否为J+1,ACk是否为1,如果正确则将标志位ACK置为1,ack=K+1,表示收到K之前的数据,并将数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    TCP四次握手

    由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
    (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
    (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
    (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
    (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

    ​ 上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:

    img

    总结

    首先TCP连接是双工的,那么要想要在服务器和客户端之间沟通,需要打通两条数据通路,一条是客户端到服务器的通路,一条是服务器到客户端的通路

    tcp三次握手

    假设客户端想和服务端建立tcp连接

    1.客户端发送

    (请求和服务器连接):首先客户端需要向服务器发送了一个一比特的SYN标志位,并设置为1,表示请求建立连接,和一个随机产生的序列号seq=j,发送数据包,然后进入SYN_SENT状态,等待服务器的响应。

    2.服务端接收发送

    服务器接收:服务器接收到了数据包,知道客户端想要建立连接

    服务器发送:1.服务端需要发送一个一比特的ACK标志位为1表示确认建立连接,和发送一个ack=j+1的序列号表示客户端发送的数据都接收到了

    ​ 2.服务器需要向客户端发送了一个一比特的SYN标志位,并设置为1,表示请求建立连接,和一个随机产生的序列号seq=j,发送数据包,然后服务器进入SYN_RCVD状态。

    3.客户端接收发送

    客户端接收:客户端接收数据包,发现ACK=1(表示服务器确认连接)在查看ack=j+1之前客户端发送的序列号,服务端都收到了(确认作用),客户端到服务端的通路建立成功。然后发现SYN=1和seq=k,表示服务器想要和客户端建立连接

    客户端发送:客户端发送ACK=1和seq=k+1,表示同意建立连接。当服务端接收到数据包后,确认连接。tcp建立成功

    tcp四次挥手

        (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
        (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
        (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
        (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
    

    1.客户端发送

    客户端想要和服务端断开连接,客户端发送一个fin置为1,表示希望断开连接

    2.服务端接收和发送

    服务端接收到数据包,接收到fin知道客户端想要断开连接

    服务端发送数据包,发送一个ack=1表示收到你的请求

    3.客户端接收和发送

    客户端接收到数据包,知道服务端收到客户端的请求断开连接的请求并表示同意

    客户端发送数据包,发送数据包给服务端,可以断开连接了

    4.服务端接收

    服务端,服务端收到客户端的可以断开连接,于是tcp连接断开成功

    具体参考博客https://www.cnblogs.com/Qing-840/p/9283367.html

    https://www.cnblogs.com/lms0755/p/9053119.html

    https://blog.csdn.net/qq_38950316/article/details/81087809

  • 相关阅读:
    worldWind发布1.3.2版本了
    XMLSerializer中数组对象的设定
    IE6+UTF8的一个怪异问题
    恢复ServU管理员密码方法
    asp.net中的窗体身份验证(不同的角色访问不同的目录)
    什么是 Landing Page?
    如何让排名更加稳定
    JS替换空格回车换行符
    外部调用ZBLOG文章的方法
    表单填写字母时大小写自动互转(CSS方式)
  • 原文地址:https://www.cnblogs.com/zx125/p/11311739.html
Copyright © 2011-2022 走看看