首页 > 编程语言 > 详细

Python——网络编程(传输层、应用层、socket介绍)

时间:2020-04-17 21:46:58      阅读:86      评论:0      收藏:0      [点我收藏+]

网络通信——传输层

  • 传输层功能:建立端口到端口的通信
  • 补充:端口范围0-65535,其中0-1023为系统占用端口,自定义时不推荐去使用0-1023这个范围内的端口

tcp协议

  • 可靠传输(开辟双向通道传输),TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

udp协议

  • 不可靠传输(只负责传,不管对方受否能接收到),”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

tcp报文

技术分享图片

tcp三次握手和四次挥手(SYN=1 ACK=1)

  • 三次握手

    ‘‘‘
    建立客户端与服务器端之间的双向通路需要进行三次握手。
    1、客户端向服务器端发送SYN报文,请求建立连接,此时客户端就处于 SYN_SENT 状态
    2、服务器监测并接收客户端的SYN报文后返回一个ACK给客户端表示确认并且也向客户端
       发起建立连接请求的SYN报文,此时服务器端就会处于 SYN_RCVD 状态
    3、客户端接收到服务器返回来的响应之后就会变成 ESTABLASHED 状态表示客户端到服
       务器端的通道建立成功,之后接收到服务器端传过来的请求报文后同样也返回一个ACK
       给服务器表示确认,服务器端接收到客户端传回的ACK后就会变成 ESTABLASHED 状态
       最终服务器端到客户端的传输通道建立完毕,至此客户端与服务器之间的双向通道建立完
       成,这就是三次握手。
    ‘‘‘
    
    # 为什么不能是二次握手?(简言之,二次握手会产生资源浪费)
    ‘‘‘
    如果是两次握手的情景: 
    客户端在发送一个连接建立请求之后进入等待状态,等到服务端确认之后就进入established状态。
    服务端在发送一个确认连接建立请求报文之后(不管客户端是否有回应)也进入established状态。 
    这就好比, A给B打电话, A:你听得到我说话吗? B:我听得到啊 A和B就都以为对方都能听得到自己了。
    但有一种情况是,B的麦是坏的,A根本就听不到B说话,结果A没收到B的回应,但B却以为A能听得到他,
    B就一直等着A说点什么...这样让B身心俱疲。
    
    而三次握手:
    客户端在发送一个连接建立请求报文之后进入等待状态,等到服务端返回确认建立连接的通知
    服务端发送确认建立连接请求报文,同时向客户端发送连接建立请求报文,进入等待状态
    客户端接受到服务端发送的确认请求报文以及来自服务端的连接建立请求报文。进入established状态
    并发送确认连接建立请 求报文给服务端。服务端接受到来自客户端的确认建立连接报文,进入established
    A:你能听得到我说话吗? B:我听得到啊,你能不能听得到我说话? 
    A:我也听得到你啊。( established) B:(established) A和B都能明确知道对方肯定能听得到自己说话
    
    当然4次握手或者n次握手也可以但是没有必要,因为如果建立连接的时间过长的话那么效果也就会大打折扣
    ‘‘‘
    

    技术分享图片

  • SYN洪水攻击

    ‘‘‘
    SYN洪水攻击:tcp是好人协议,不管是什么客户端,只要向服务器发送了请求服务器就会接收并尝试向客户端建立连
    接。SYN洪水攻击,就是利用建立大量的虚拟ip去向服务器发送请求,发完之后就消失,此时服务器就会被大量的
    虚拟ip所占满了一直处于`SYN_RCVD`状态,导致真正的客户端再想访问服务器就没法访问
    (类似于让一群乞丐去堵一家公司的大门,导致公司员工无法进入公司)
    ‘‘‘
    
  • 四次挥手

    # 断开链接时,由于链接内有数据传输,所以必须分四次断开
    

技术分享图片

网络通信——应用层

自定义协议

  • 在应用层如果觉得别人的协议过于的复杂,我们可以自定义协议=》头部+数据部分

    # 自定义协议需要注意的问题:
    ‘‘‘
    1、两大组成部分=头部+数据部分
       头部:放对数据的描述信息
          比如:数据要发给谁,数据的类型,数据的长度
       数据部分:想要发的数据
    
    2、头部的长度必须固定
      因为接收端要通过头部获取所接接收数据的详细信息
    ‘‘‘
    
    # 应用层的协议:http https ftp
    

Socket

socket的作用

  • 我们只需要负责应用层即可,传输层网络层数据链路层以及物理层之间的通信,socket帮我们全部都处理好了,所以我们只要负责好应用层就可以利用socket来进心网络通信了。

  • socket是位于应用层与传输层之间的一个抽象层它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

  • 也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序而程序的pid是同一台机器上不同进程或者线程的标识

    技术分享图片程在网络中通信。

小结

总结图附上:

技术分享图片

数据传输动图如下

技术分享图片

Python——网络编程(传输层、应用层、socket介绍)

原文:https://www.cnblogs.com/guanxiying/p/12722191.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!