socket和抓包⼯具wireshark
socket和抓包⼯具wireshark
最近在学习Python代码中的socket和抓包⼯具wireshark,故⼜将socket等概念⼜学习了⼀遍,温故⽽知新:
Python代码如下:
server:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# ⽂件名:server.py
import socket # 导⼊ socket 模块
s = socket.socket() # 创建 socket 对象
host = hostname() # 获取本地主机名
socket通信报文格式port = 12345 # 设置端⼝
s.bind((host, port)) # 绑定端⼝
s.listen(5) # 等待客户端连接
while True:
c, addr = s.accept() # 建⽴客户端连接。
print 'conect_address:', addr
c.send('welcome to python!')
c.close() # 关闭连接
client:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# ⽂件名:client.py
import socket # 导⼊ socket 模块
s = socket.socket() # 创建 socket 对象
host = hostname() # 获取本地主机名
port = 12345 # 设置端⼝好
v(1024)
s.close()
启动server后⽤client进⾏访问,
wireshark监听本地回环⽹卡,抓取tcp.port==12345的ip报⽂
可以从抓取的报⽂中看到返回的内容
总结:
在TCP和UDP同属于传输层,共同架设在IP层(⽹络层)之上。⽽IP层主要负责的是在节点之间(End to End)的数据包传送,这⾥的节点是⼀台⽹络设备,⽐如计算机。因为IP层只负责把数据送到节点,⽽不能区分上⾯的不同应⽤,所以TCP和UDP协议在其基础上加⼊了端⼝的信息,端⼝于是标识的是⼀个节点上的⼀个应⽤。除了增加端⼝信息,UPD协议基本就没有对IP层的数据进⾏任何的处理了。⽽TCP协议还加⼊了更加复杂的传输控制,⽐如滑动的数据发送窗⼝(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应⽤层看到的是怎样⼀个稳定的TCP数据流,下⾯传送的都是⼀个个的IP数据包,需要由TCP协议来进⾏数据重组。
现在我们明⽩,如果⼀个程序创建了⼀个socket,并让其监听80端⼝,其实是向TCP/IP协议栈声明了其对80端⼝的占有。以后,所有⽬标是80端⼝的TCP数据包都会转发给该程序(这⾥的程序,因为使⽤的是Socket编程接⼝,所以⾸先由Socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建⽴过程。accept函数返回的新socket其实指代的是本次创建的连接,⽽⼀个连接是包括两部分信息的,⼀个是源IP和源端⼝,另⼀个是宿IP和宿端⼝。所以,accept可以产⽣多个不同的socket,⽽这些socket⾥包含的宿IP和宿端⼝是不变的,变化的只是源IP和源端⼝。这样的话,这些socket宿端⼝就可以都是80,⽽Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从⽽完成对TCP/IP协议的操作封装!
TCP 使⽤固定的连接
TCP ⽤于应⽤程序之间的通信。
当应⽤程序希望通过 TCP 与另⼀个应⽤程序通信时,它会发送⼀个通信请求。这个请求必须被送到⼀个确切的地址。在双⽅"握⼿"之
后,TCP 将在两个应⽤程序之间建⽴⼀个全双⼯ (full-duplex) 的通信。
这个全双⼯的通信将占⽤两个计算机之间的通信线路,直到它被⼀⽅或双⽅关闭为⽌。
UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。
IP 是⽆连接的
IP ⽤于计算机之间的通信。
IP 是⽆连接的通信协议。它不会占⽤两个正在通信的计算机之间的通信线路。这样,IP 就降低了对⽹络线路的需求。每条线可以同时满⾜许多不同的计算机之间的通信需要。
通过 IP,消息(或者其他数据)被分割为⼩的独⽴的包,并通过因特⽹在计算机之间传送。
IP 负责将每个包路由⾄它的⽬的地。
IP 路由器
当⼀个 IP 包从⼀台计算机被发送,它会到达⼀个 IP 路由器。
IP 路由器负责将这个包路由⾄它的⽬的地,直接地或者通过其他的路由器。
在⼀个相同的通信中,⼀个包所经由的路径可能会和其他的包不同。⽽路由器负责根据通信量、⽹络中的错误或者其他参数来进⾏正确地寻址。
TCP/IP
TCP/IP 意味着 TCP 和 IP 在⼀起协同⼯作。
TCP 负责应⽤软件(⽐如您的浏览器)和⽹络软件之间的通信。
IP 负责计算机之间的通信。
TCP 负责将数据分割并装⼊ IP 包,然后在它们到达的时候重新组合它们。
IP 负责将包发送⾄接受者。
1、TCP连接
建⽴起⼀个TCP连接需要经过“三次握⼿”:
第⼀次握⼿:客户端发送syn包(syn=j)到服务器,并进⼊SYN_SEND状态,等待服务器确认;
第⼆次握⼿:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时⾃⼰也发送⼀个SYN包(syn=k),即SYN+ACK包,此时服务器进⼊SYN_RECV状态;
第三次握⼿:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进⼊ESTABLISHED状态,完成三次握⼿。
握⼿过程中传送的包⾥不包含数据,三次握⼿完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接⼀旦建⽴,在通信双⽅中的任何⼀⽅主动关闭连接之前,TCP 连接都将被⼀直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握⼿”(过程就不细写了,就是服务器和客户端交互,最终确定断开)
2、SOCKET
套接字(socket)是通信的基⽯,是⽀持TCP/IP协议的⽹络通信的基本操作单元。它是⽹络通信过程中
端点的抽象表⽰,包含进⾏⽹络通信必须的五种信息:连接使⽤的协议,本地主机的IP地址,本地进程的协议端⼝,远地主机的IP地址,远地进程的协议端⼝。
应⽤层通过传输层进⾏数据通信时,TCP会遇到同时为多个应⽤程序进程提供并发服务的问题。多个TCP连接或多个应⽤程序进程可能需要通过同⼀个 TCP协议端⼝传输数据。为了区别不同的应⽤程序进程和连接,许多计算机操作系统为应⽤程序与TCP/IP协议交互提供了套接字(Socket)接⼝。应⽤层可以和传输层通过Socket接⼝,区分来⾃不同应⽤程序进程或⽹络连接的通信,实现数据传输的并发服务
3、HTTP连接
HTTP协议即超⽂本传送协议(Hypertext Transfer Protocol ),是Web联⽹的基础,也是⼿机联⽹常⽤的协议之⼀,HTTP协议是建⽴在TCP 协议之上的⼀种应⽤。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建⽴连接到关闭连接的过程称为“⼀次连接”。
1)在HTTP 1.0中,客户端的每次请求都要求建⽴⼀次单独的连接,在处理完本次请求后,就⾃动释放连接。
2)在HTTP 1.1中则可以在⼀次连接中处理多个请求,并且多个请求可以重叠进⾏,不需要等待⼀个请
求结束后再发送下⼀个请求。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是⼀种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔⼀段固定的时间向服务器发送⼀次“保持连接”的请求,服务器在收到该请求后对客户端进⾏回复,表明知道客户端“在线”。若服务器长时间⽆法收到客户端的请求,则认为客户端“下线”,若客户端长时间⽆法收到服务器的回复,则认为⽹络已经断开。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论