鲁照山

  1. 1、网络协议的5层模型,每层内容的整理
  2. 2、画图描述三次握手四次挥手,和CS端的状态
  3. 3、写一个客户端,实现给服务端发送hello world 字符串,
  4. 写一个服务端,将客户端发送的数据变成大写后返回。

5层协议:应传网数物

应用层、传输层、网络层、数据链路层、物理层【简称:应传网数物】

应用层

  1. ## 应用层:使用B/s架构或者C/s架构的应用程序进行访问。
  2. 上网流程分析
  3. --在浏览器输入www.baidu.com
  4. --会取DNS服务器通过域名解析成IP地址
  5. --向IP+端口号这个地址发送请求,就会访问到百度的服务器。
  6. scoket:在应用层和传输层之间的一个抽象层,他爸TCP/IP层复杂的操作抽象为几个接口供应层调用已实现进程在网络中的通信。

传输层

  1. ## 传输层:
  2. TCP协议:
  3. -三次握手,四次挥手【重点】,连接如何建立,
  4. dosddos攻击称之为:拒绝服务攻击,和分布式的拒绝服务攻击。
  5. --端口号:
  6. 端口范围0-655350-1023为系统占用端口
  7. --udp协议:
  8. 发送数据,不需要响应,所以数据不可靠,主要用于看视频这些网站上
  9. --端口:
  10. IP+子网掩码----可以确定一台设备
  11. 通过IP+子网掩码+端口号---可以确定一个软件

网络层

  1. --ip:
  2. ipv4:322进制表示,范围有限,不能表示出所有的设备,于是出现了
  3. ipv6
  4. --子网掩码:
  5. 通过子网掩码和IP判断两个IP是否在同一个网段,通过IP地址和子网掩码做按位和运算。
  6. ip地址: 172.16.10.1 10101100.00010000.00001010.000000001
  7. 子网掩码:255.255.255.0: 11111111.11111111.11111111.000000000
  8. 按位与运算:172.16.10.0 10101100.00010000.00001010.000000000
  9. -ipmac有转换关系
  10. -主机172.16.10.10/24访问172.16.10.11/24
  11. - ARP协议:广播的方式发送数据包,获取目标主机的mac地址
  12. -mac地址学习:mac地址和ip地址的映射表
  13. -第一次接收到就会在ip/mac映射表中添加一条数据{’172.16.10.11“:ddsadfgegsdgsdg}
  14. -任何一种协议都有头和内容

数据链路层

  1. --把物理层的电信号分组,每一组叫一个数据报/数据帧,每一数据帧分成:报头head和数据data两部分。
  2. ---每一个数据报,都由报头和数据部分
  3. -头:固定18个字节,6:发送者地址/6:接收者地址/6:数据类型
  4. -mac地址 :发送者,接收者地址,就是mac地址
  5. -每块网卡都有一个唯一mac地址:1216进制数表示(前六位是厂商编号,后六位是流水线号)
  6. -广播:同一个局域网内通信 ,会出现广播风暴

物理层

就是一堆010101的电信号。

三次握手

  1. 三次握手:
  2. 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
  3. 第二次握手:服务器收到syn包,必须确认客户的SYNack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  4. 第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
  5. 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

三次握手图解

四次挥手

  1. 四次挥手
  2. 与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
  3. 第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
  4. 第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
  5. 第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
  6. 第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

四次挥手图解

  1. FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKETESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
  2. FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
  3. TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
  4. CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
  5. CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
  6. LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
  7. 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
  8. 是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACKSYNACK起应答作用,而SYN起同步作用)放在一 个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未 必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 FIN报文多数情况下都是分开发送的。

通信服务端

  1. #导入一个socket模块
  2. import socket
  3. #想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM
  4. #买了个手机
  5. soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6. #插电话卡:绑定ip地址 传元组:(ip,端口号)
  7. soc.bind(('192.168.11.254',8080)) #如果写本机ip,局域网外部可以访问
  8. # 监听对方打电话
  9. soc.listen(5)
  10. #等待别人给我打电话
  11. conn,addr=soc.accept()
  12. # conn 就是通路
  13. #接收1024个字节
  14. data=conn.recv(1024)
  15. print('我收到用户端发的',data.upper()) #转换为大写
  16. #conn.send 发送数据,数据必须是bytes格式
  17. conn.send(bytes(data.upper()))
  18. #挂断电话
  19. conn.close()
  20. #销毁手机
  21. soc.close()

通信用户端


  1. import socket
  2. #创建一个socket对象
  3. soc=socket.socket()
  4. #连接服务端
  5. soc.connect(('192.168.11.254',8080))
  6. #发送消息
  7. soc.send(b'hello world')
  8. data=soc.recv(1024)
  9. print('我收到服务端回的',data)
  10. #关闭连接
  11. soc.close()

网络编程基础之socket套接字编程实现同一IP下的信息传输的更多相关文章

  1. 网络编程基础之Socket套接字

    一.Socket介绍 1.什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...

  2. 网络编程基础之Socket套接字简单应用

    一.Socket套接字实现通信循环 所谓通信循环,简单理解就是客户端可以给服务端循环发送信息并获得反馈的过程. 1.基础版 通信循环的程序分为两部分,即两个python模块,分别为客户端.py和服务端 ...

  3. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  4. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  5. day31 socket套接字编程

    为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...

  6. socket套接字编程 HTTP协议

    socket套接字编程  套接字介绍  1. 套接字 : 实现网络编程进行数据传输的一种技术手段  2. Python实现套接字编程:import  socket  3. 套接字分类 >流式套接 ...

  7. socket 套接字编程

    今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...

  8. 网络编程初识和socket套接字

    网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...

  9. 19、网络编程 (Socket套接字编程)

    网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...

随机推荐

  1. 解决FirewallD is not running问题

    centos7 1.查看firewalld状态:systemctl status firewalld,如果是dead状态,即防火墙未开启. 2.开启防火墙systemctl start firewal ...

  2. Itellij idea2019.2 激活码,有效期2020.5

    Itellij idea2019.2 激活码,有效期2020.5 MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGljZW5zZWVOYW1lIjoi ...

  3. 操作系统——银行家算法(Banker's Algorithm)

    之前写过一篇关于死锁和银行家算法的详细描述的博客https://www.cnblogs.com/wkfvawl/p/11598647.html 写这篇博客的目的,主要是详细讲解一下银行家算法以及代码的 ...

  4. jquery对类的操作,添加,删除,点击添加,再点击删除

    jquery对类的操作,添加(addClass),删除l类(remoceClass),点击添加,再点击删除(toggleClass)

  5. JAVA,Python代码是编译执行还是解释执行?

    转载地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641 有人在讨论 Python 代码是编译执行还是解释执行?这 ...

  6. JNI教程与技术手册

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52806794 本文出自: [HansChen的博客] 概述 对于JNI,有些童鞋在没 ...

  7. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...

  8. polygon()函数

    polygon():draw the polygons where vertices are given in x and y. polygon(x,y=NULL,density=NULL,angle ...

  9. 用.NET解索尼相机ARW格式照片

    用.NET解索尼相机ARW格式照片 目前常用的照片格式是.jpg,它只能提供8bit的色彩深度,而目前主流的相机都能提供高达12bit-14bit的色彩深度,动态范围和后期处理能力也大大增加,这也是为 ...

  10. 基于webpack实现多html页面开发框架六 提取公共代码

    一.解决什么问题 1.如果a.js和b.js都引用了common.js,那在打包的时候common.js会被重复打入到a.js和b.js,造成重复打包 2.单独打包common.js对性能有帮助,浏览 ...