![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
tcp/ip网络编程
文章平均质量分 93
盼盼编程
这个作者很懒,什么都没留下…
展开
-
TCP 连接的前世今生
前言大家好!我是盼盼!之前写了几篇关于算法和 linux 命令的文章,今天来学习下,网络协议相关的知识。不管你是客户端,还是服务端开发,网络协议这块都是要学习和了解的。工作和面试中,网络协议都会用到。虽然学习网络对编码没有实质的帮助,但对你处理一下网络连接问题,帮助大大的。下面来一起学习下,发车!缘起在世界上各地,各种各样的电脑,运行着各自不同的操作系统为大家服务。这些电脑,在表达同一种信息的时候,所使用的方法是千差万别。计算机使用者意识到,计算机只是单兵作战,并不会发挥太大原创 2021-06-10 19:32:07 · 1670 阅读 · 23 评论 -
Go中的Socket编程
在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程。你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和Web服务器进行通信的呢?当你用QQ聊天时,QQ进程怎么和服务器或者是你的好友所在的QQ进程进行通信的呢?当你打开PPstream观看视频时,PPstream进程如何与视频服务器进行通信的呢? 如此种种,都是靠Socket来进行通信的,以一斑窥全豹,可见Socket编程在现代编程中占据了多么重要的地位,这一节我们原创 2021-02-09 11:15:34 · 957 阅读 · 4 评论 -
tcp断开连接的几种状态
FIN_WAIT_1:主动关闭连接的一方等待对方返回ACK包。若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态,等待对方返回ACK包,此后还能读取数据,但不能发送数据。在正常情况下,无论对方处于何种状态,都应该马上返回ACK包,所以FIN_WAIT_1状态一般很难见到。FIN_WAIT_2:主动关闭连接的一方收到对方返回的ACK包后,等待对方发送FIN包。处于FIN_WAIT_1状态下的Socket收到了对方返回的原创 2020-10-18 10:38:55 · 12427 阅读 · 3 评论 -
tcp建立连接的时的几种状态
CLOSED:初始状态,表示没有任何连接。LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求。SYN_SENT:发送连接请求后等待确认信息。当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包。SYN_RECEIVED:收到一个连接请求后回送确认信息和对等的连接请求,然后等待确认信息。通常是建立TCP连接的三次握手过程中的一个中间状态,表示Server端的Socket接收到原创 2020-10-18 10:37:53 · 9300 阅读 · 3 评论 -
常见套接字类型
本地节点的路径名(Unix套接字),Unix domain sockets(UDS)CCITT X.25(X.25套接字)DARPA Internet 地址(Internet套接字),这是最具代表性、最经典的、最常用的Socket,我们经常讲的套接字也就是Internet Scoket。根据数据传输方式,可以将Internet Socket分成几种,在使用socket()创建网络连接时,必须告诉它是哪一种数据传输方式,简单来说就是数据传输的控制协议...原创 2020-10-18 10:08:01 · 7979 阅读 · 3 评论 -
DNS工作原理
当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别。基于UDP服务,端口53. 该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换...原创 2020-10-13 22:03:48 · 9650 阅读 · 3 评论 -
面试常考--socket常见错误
ECONNREFUSED(111): 没有这个端口 EAGAIN(11): buff已满 EPIPE(32): 客户端断掉了 ECONNRESET(104): 连接被重置 ENOBUFS(105): 例如:使用udp发送>=128K的消息会报ENO...原创 2020-10-02 13:08:29 · 15566 阅读 · 7 评论 -
IP分片
链路层通常对可传输的每一个帧的最大长度都有上限。为了使超过此上限的ip数据报能够正常传输,IP引入了“分片”和“重组”。 当IP层接收到要发送的IP数据报时,通过查找“转发表”,会判断该数据报应该从那个本地“接口”发送以及MTU是多少。 不同的网络类型,其MTU都不相同,如以太网中MTU为1518字节,FDDI为4500字节。 如果IP数据报超过MTU值,则进行分片。IPv4的分片可以在原始发送方主机和端到端路径上的任何中间路由器上进行,即:一个...原创 2020-09-14 23:01:16 · 12047 阅读 · 4 评论 -
IP转发行动
当一台主机或路由器需要向下一跳转发数据报时,它首先检查数据报中的IP地址。在算法表中使用该IP地址来执行最长前缀匹配算法。最长前缀匹配算法:当路由器接收到一个IP数据包时,将数据包的目的ip地址与本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目,并确定下一跳...原创 2020-09-14 22:59:45 · 11856 阅读 · 4 评论 -
IP转发表
IP转发表通常需要包含以下信息。 目的地: 32位字段(用于IPv4), 当目的地为“默认路由”时,目的地可设置为0。 对于仅描述一个目的地的主机路由,目的地可设为完整的ip地址。 掩码: 掩码是和目的地ip组合使用的,将ip地址与子网掩码进行“按位与”运算,就能得出用于路由的“子网标识符”。 下一跳: 下一个IP实体(路由器或主机)的IP地址。 接口...原创 2020-09-14 22:57:05 · 13509 阅读 · 4 评论 -
IP转发
主机和路由器都能转发ip,不同之处在于:主机不转发那些不是由它生成的数据报,但路由器会转发。 IP地址可以接收一个数据报。 当IP模块接收到一个数据报时, 首先检查此数据报的目的地址是否为自己的IP地址, 如果不是,且IP层配置为一台路由器,则根据“转发表”转发该数据报。 否则丢弃此数据报,然后返回给源节点一个信息,表明错误...原创 2020-09-14 22:55:36 · 11993 阅读 · 4 评论 -
IP子网寻址
ip地址从分成了三级:网络号、子网ID、主机ID 划分子网ID的方法是从“原有的主机号中借用若干位”作为子网号 网络信息中心集中分配每一个网络号 然后各个站点的管理人员再分配他们网络号下的子网ID和对应的主机ID。然后管理员在安排每一个子网下面的主机数...原创 2020-09-14 22:51:07 · 12122 阅读 · 3 评论 -
IP地址分类
PV4被分为五大类:ABCDE A类为:点分四组中的第一组地址范围为0~127的IP地址。已二进制来看就是“首位为0” B类:128~191.二进制首位为10 C类:192~223.二进制首位为110 D类:224~239.二进制首位为1110 E类:240~255.二进制首位为1111...原创 2020-09-14 22:49:37 · 11979 阅读 · 3 评论 -
tcp/ip详解--ttl
TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。 TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机...原创 2020-09-12 23:16:01 · 13524 阅读 · 4 评论 -
tcp/ip详解--环回接口
大多数的产品都支持环回接口(Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现。 一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离...原创 2020-09-12 23:13:36 · 13568 阅读 · 3 评论 -
tcpip详解--端口号
TCP和UDP采用16 bit的端口号来识别应用程序。那么这些端口号是如何选择的呢? 服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号。这些知名端口号由Internet号分配机构(Internet Assigned Numbers Authorit...原创 2020-09-12 23:10:13 · 15689 阅读 · 4 评论 -
tcp/ip详解--封装
应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息。 TCP传给IP的数据单元称作TCP报文段或简称为TCP段。IP传给网络接口层的数据单元称作IP数据报(IP datagram)。通过以太网传输的比特流称作帧。 UDP数据与TCP数据基本一致。唯一的不同是UDP传给IP的信息单元称作UDP数据报,而且UDP的首部长为8字节。...原创 2020-09-12 23:08:17 · 13403 阅读 · 3 评论 -
tcp/ip详解--分层
网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统:应用层,运输层,网络层,链路层。链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),I...原创 2020-09-12 23:06:02 · 12848 阅读 · 3 评论 -
CSRF攻击
CSRF攻击(Cross Site Request forgery) 全称跨站请求伪造攻击者盗用你在某网站的身份如cookie,以你的名义向该网站发送恶意请求。这个就比较可怕了,能够利用你的身份发邮件,发短信,甚至转账,盗取账号等。首先用户C访问站点A,然后通过信息验证完成登陆,此时产生cookie值保存在浏览器中,然后用户C在没有退出该网站的情况下,无意中访问了恶意的站点B,此时站点B的某个页面带着站点A的cookie 向站点A 发恶意请求,站点A根据请求所带的cookie,判断此请求为用户发送.原创 2020-08-31 21:44:30 · 9739 阅读 · 4 评论 -
XSS攻击
XSS攻击(Cross Site Scripting) 全称跨站脚本攻击攻击者主要通过嵌入恶意脚本程序,当用户打开网页时,脚本程序便在客户端的浏览器中执行,以盗取客户端cookie,用户名密码,下载执行病毒木马程序等<input type="text" name="nick" value=" "/><script>alert("你是煞笔")</script><!-" ">【value传值传入sricpt脚本】防御手段: XSS之所以能...原创 2020-08-31 21:43:30 · 9435 阅读 · 6 评论 -
ip协议基础
IP协议:1.IP服务的特点:IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。无状态是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。无连接是指IP通信双方都不长久地维持对方的任何信息。不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力。2.IPv4的头部3.IP转发:不是发送给本机的IP数据报将由数据报转发子模块来处理。路由器都能执行数据报的转发操作,而主机一般只能发送和接受数原创 2020-08-30 21:58:22 · 10173 阅读 · 3 评论 -
tcp传输中的序列号
tcp三次握手的syn序列号是随机产生的tcp包中的ack字段是根据对端的序列号来的SeqNum的增加是和传输的字节数相关的,旧SeqNum+字节数=新SeqNum接收端给发送端的Ack确认只会确认最后一个连续的包...原创 2020-08-30 21:56:49 · 10116 阅读 · 2 评论 -
几种常见的编码
ASCII码:美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII 码Unicode:世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码UTF-8:互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。UTF原创 2020-08-27 21:59:41 · 11130 阅读 · 3 评论 -
同步通信和异步通信区别
同步通信与异步通信区别:1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。 2.同步通信效率高;异步通信效率较低。 3.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。 4.同步通信可用于点对多点;异步通信只适用于点对点。...原创 2020-08-27 21:57:32 · 20095 阅读 · 1 评论 -
TCP和UDP区别
UDP面向无连接的,发送数据前不需要建立连接。(2)是否提供可靠交付TCP在传输数据之前,需要三次握手来建立连接,并且通过数据校验、拥塞控制、重传控制、滑动窗口和确认应答等机制来实现可靠交付。数据传输过程中,数据无丢失,无重复,无乱序。UDP不提供可靠交付,只有通过检验和去丢弃那些不完整的报文,尽最大努力来保证交付的可靠性。(3)工作效率前面提到TCP传输数据的控制非常多,这也导致了TCP网络开销大,工作效率相对低下,对系统的资源要求也比较高。UDP传输控制简单,因此工作效率相对高,原创 2020-08-27 21:54:23 · 9408 阅读 · 1 评论 -
send/recv阻塞和非租塞不同
[send]在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送就返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send会等待接收端对之前发送数据的确认,以便腾出缓存空间容纳新的待发送数据,再返回,如果一直没有空间能容纳待发送的数据,则一直阻塞;在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,立即返回成功拷贝的大小;如缓存区可用空.原创 2020-08-27 21:52:39 · 9611 阅读 · 1 评论 -
TCP和UDP可以同时监听相同的端口
TCP和UDP可以同时监听相同的端口吗(可以)IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他。操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文,就是说,系统读数据的时候还没有读到上层报文(TCP/UDP)的时候已经知道上层是什么报文了,直接交给相关的内核进程或协议栈处理就可以了。而在同一个协议内部端口号唯一。...原创 2020-08-27 21:47:30 · 10026 阅读 · 1 评论 -
网络编程中的MTU
MTU为最大传输单元,它的含义实际上就是数据链路对IP包长度要求的最大值,以太网不得超过1500。MSS表示最大段的最大值,它是与TCP相关的一个概念,TCP的传输层是分段的,数据链路层期望的最大IP包长是1500字节,那么除去IP包头典型的20字节,再除去TCP包头典型的20字节(或者其他<=60字节的数据),可知,数据链路允许的最大TCP业务长度是1460字节。所以最大段(MSS)是1460字节。一帧不能超过1518字节,因为帧头占18字节,帧头包括:目的MAC(6)+源MAC(6)+Type(2原创 2020-08-26 21:56:20 · 10272 阅读 · 5 评论 -
socket什么情况下可读
socket什么情况下可读1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值2.连接的读一半关闭(即:接收到对方发过来的FIN的TCP连接),并且返回0;3.socket收到了对方的connect请求已经完成的连接数为非0.这样的soocket处于可读状态;4.异常的情况下socket的读操作将不会阻塞,并且返回一个错误(-1)。...原创 2020-08-26 21:36:35 · 9769 阅读 · 3 评论 -
FD_WRITE触发条件
FD_WRITE触发条件:1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件2.server通过accept(WSAAccept)接受client连接请求时,在server端会触发FD_WRITE事件3.send(WSASend)/sendto(WSASendTo)发送失败返回WSAEWOULDBLOCK,并且当缓冲区有可用空间时,则会触发FD_WRITE事件...原创 2020-08-26 21:37:46 · 9763 阅读 · 4 评论 -
select,poll,epoll区别面试常问
select,poll,epoll区别:select优点1)select()的可移植性更好,在某些Unix系统上不支持poll()2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。select缺点1) 单个进程可监视的fd数量被限制。2) 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。3) 对fd进行扫描时是线性扫描。fd剧增后,IO效率较低,因为每次调用都对fd进行线性扫描遍历,所以随着fd的增加会造.原创 2020-08-26 21:34:56 · 9936 阅读 · 2 评论 -
tcp三次握手为啥不是4次
tcp的连接过程中有一个超时重传算法(karn算法是比较典型的), 如果client发出syn包后, 由于网络原因, 没有立即收到ack/syn包, 那么client会再次发起syn包, 这一点, 我们已经多次实验过。如果第二次syn包正常达到且与server端建立了tcp连接, server端维护了一个连接, 一次貌似OK, 但别忘了, 第一次那个syn包可能就在此时达到server端了, 于是server端又要维护一个连接, 而这个连接是无效的, 可以认为是死连接。 ...原创 2020-08-25 22:37:34 · 9469 阅读 · 5 评论 -
tcp四次挥手
4次挥手:第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。第四次挥手:Client收到FIN后,C原创 2020-08-25 22:29:47 · 9489 阅读 · 2 评论 -
tcp三次握手
三次握手:第一次握手:建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认第二次握手:服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK,此时服务端进入SYN_RECV状态第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态...原创 2020-08-25 22:28:18 · 10038 阅读 · 1 评论 -
DoS攻击
XSS攻击(Cross Site Scripting) 全称跨站脚本攻击攻击者主要通过嵌入恶意脚本程序,当用户打开网页时,脚本程序便在客户端的浏览器中执行,以盗取客户端cookie,用户名密码,下载执行病毒木马程序等<input type="text" name="nick" value=" "/><script>alert("你是煞笔")</script><!-" ">【value传值传入sricpt脚本】防御手段: XSS之所以能...原创 2020-08-25 22:21:28 · 10582 阅读 · 3 评论 -
thrift RPC接口请求超时
某次client调用服务端RPC接口超时导致连接断开,但是server说自己返回数据了,然后client用tcpdump抓包发现没抓到server返回的数据,但是server端说自己返回数据了啊,不能相信。让server端用tcpdump去抓包,发现server端没向client端发送数据,server把数据塞入RPC接口,就没管了,RPC接口并没有发数据,导致server端tcpdump没抓到包,最后发现当发送的数据过去时,RPC接口不会讲数据发送出去。...原创 2020-07-08 23:39:12 · 11504 阅读 · 2 评论 -
多线程服务端和客户端通信
golang示例多线程服务端和客户端通信package mainimport ( "net" "fmt" "time")func server(){ listen_sock, err := net.Listen("tcp", "0.0.0.0:8888") if err != nil { fmt.Println("listen error") return; } defer listen_sock.Close() conn, err := li...原创 2020-05-16 23:09:23 · 14855 阅读 · 2 评论 -
异步调用之内存拷贝
某次写一个库给前端调用,前端在传入一个分配的内存块给库里面有数据,然后库通过消息队列的方式将数据存储起来,发给服务端,但服务端收到的数据出现概率性乱码。 服务端打印收到的数据异常,客户端打印数据发现,发出去的数据是空。 最后找到前端传入的内存块,进入库的消息队列之后,前端函数返回,前端对应内存块释放,消息队列保存的数据为空了,这是异步调用的...原创 2020-01-19 09:39:14 · 10317 阅读 · 2 评论 -
wireshark抓包数据学习
直接看数据 Seq=33572898,len=2896。33572898+2896=seq(3357594)说明是连续发包。服务端提示windows full指的是发生缓冲区满了,因为发送缓冲的数据只有在收到ACK之后才会被干掉,一直收不到ACK会导致发送缓冲区满了,造成不能发数据。 客户端最后一次更新的大小是14240。后续服务端发送289...原创 2019-07-30 21:06:57 · 10283 阅读 · 2 评论 -
TCP滑动窗口
TCP滑动窗口是用来控制流量的,避免拥塞的发生。滑动窗口又包括接收端滑动窗口和发送端滑动窗口,下面我们简单分析一下。 上图显示的是接收缓冲区,其中接收窗口也在其中。接收窗口的大小是8,即4~12,此时由A可知,接收端下一个预计接收序列号4,当接收端接收到4~7之后,滑动窗口就会右移,此时接收端预计接收的下一个序列号为8,即图B的结...原创 2018-05-02 20:18:58 · 10176 阅读 · 3 评论