首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《网络是怎么样连接的》读书笔记 - TcpIP连接(二)

**Socket连接套接字链接在表面上看就是建立连接,交换数据,断开连接,虽然实际上细节肯定没有那么简单,但是大体上的思路基本不变。...描述符是和委托创建套接字的 应用程序进行交互时使用的,并不是用来告诉网络连接的另一方。客户端也无法知道服务器上的描述符,客户端也无法通过服务器端的描述符去确定位于服务器上的某 一个套接字。〉...最后一步:当服务器收到客户端的确认,也进入已连接状态。图片经过三次握手连接建立,直到断开连接之前都可以传递数据。...,然后将这个数值写入 TCP头部的 ACK 号中发送给发送方,以表示自己到底受到了多少数据,如果中间存在缺少数据则服务端重新传输即可。...协议栈会将接收到的数据复制到应用程序指定的内存地址中,然后将控制流程交回应用程序断开连接断开连接的部分包含断开连接和删除套接字的操作,断开连接也就是经典的四次挥手的操作,而删除套接字则需要注意在协议栈中并没有规定关闭的时间

70530

网络是怎样连接的 第一、二章 笔记

通信阶段) 4.断开管道并删除套接字 (断开阶段) 管道在连接时是有客户端发起的,但在断开时可以由客户端或服务器任意一方发起 当管道断开后,套接字就会被删除 注:以上四个操作都是由协议栈来执行的,浏览器等应用程序并不会自己去做...例如:80, 443, 25, 22是规定的 而一些程序可以在配置文件内修改端口 客户端在创建套接字时,协议栈会为这个套接字随便分配一个端口号 当协议栈进行连接操作时,会将这个端口号通知给服务器 连接操作的对象是某个具体的套接字...当消息被存放到内存缓冲区时,就相当于已经转交给了应用程序 断开阶段 调用Socke库的close程序组件 连接在套接字之间的管道会被断开,套接字本身也会被删除 Web使用的HTTP协议规定,当Web服务器发送完响应消息后...,连接已断开,浏览器得知后,也会调用close进入断开阶段 第二章 用电信号传递 TCP/IP 数据 学习 网络控制软件(协议栈)和网络硬件(网卡)是如何发送数据的 创建套接字 协议栈的内部结构 web_p61...模块根据TCP头部中的信息找到端口号对应的套接字 找到套接字后,套接字中会写入相应的信息,并将状态改为正在连接 上述操作完成后,服务器TCP模块会返回响应,这个过程和客户端一样,需要在TCP头部中设置发送方和接收方以及

85810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《网络是怎么样连接的》读书笔记 - TcpIP连接(二)

    Socket连接 套接字链接在表面上看就是建立连接,交换数据,断开连接,虽然实际上细节肯定没有那么简单,但是大体上的思路基本不变。...为什么不能用描述符标识应用程序的入口? 描述符是和委托创建套接字的 应用程序进行交互时使用的,并不是用来告诉网络连接的另一方。...最后一步:当服务器收到客户端的确认,也进入已连接状态。 经过三次握手连接建立,直到断开连接之前都可以传递数据。...,计算出一共已经收到了多少个字节,然后将这个数值写入 TCP头部的 ACK 号中发送给发送方,以表示自己到底受到了多少数据,如果中间存在缺少数据则服务端重新传输即可。...协议栈会将接收到的数据复制到应用程序指定的内存地址中,然后将控制流程交回应用程序 断开连接 断开连接的部分包含断开连接和删除套接字的操作,断开连接也就是经典的四次挥手的操作,而删除套接字则需要注意在协议栈中并没有规定关闭的时间

    53840

    Linux 性能调优之网络内核参数优化

    同时标记数据包的发送顺序 传输层 传输层即进行建立连接或者断开连接,在两个主机之间创建逻辑上的通信连接,确保数据是否到达,没到达重发,保证数据的可靠性,涉及到的协议包括 TCP,UDP,DCDC 网络层...传输层和网络层的数据流转 数据传输(出站) : 首先,应用程序通过操作系统提供网络套接字API(编程接口)将数据写入到socket文件描述符, 即数据被写入到 socket 文件,然后放到传输缓存中,常见的协议包括...软中断处理程序会从接收缓冲区中读取数据包,并进行必要的处理。这包括解析数据包的各个层级协议头部(例如以太网头部、IP头部等),将数据包移交给IP层进行进一步的处理。...如果 BDP(时延带宽乘积)大于64KiB(64千字节),则在 TCP 连接中建议启用TCP窗口缩放(TCP window scaling)。...当碎片缓冲区的使用率低于该阈值时,内核会停止丢弃新到达的碎片。 net.ipv4.ipfrag_max_dist 是一个用于限制数据包分片重组的内核参数。

    2K20

    CS 144 Lab Seven -- putting it all together

    这个系统调用创建的一对相互连接的套接字完成 UDPSocket: 对本机Linux网络子系统提供的UDP socket进行的包装 TCPSocket: 对本机Linux网络子系统提供的TCP socket...例如,SOCK_STREAM 表示流式套接字(用于 TCP),SOCK_DGRAM 表示数据报套接字(用于 UDP)。这个参数决定了套接字将如何进行数据传输。...socket的sednmsg将准备好的UDP数据包发送出去(此处说的是Linux网络子系统中提供的udp socket) // 发送UDP数据报: socket描述符,存放目的地址的缓冲区,缓冲区大小...TCP数据段,网络接口将处理完毕的数据段写入_segment_out输出队列 // 然后调用send_pending将队列中带输出的以太网帧写入通道 void write(TCPSegment...lab four而言更加复杂,数据读写过程共涉及三个事件循环公共协作完成,首先我们来看一下键盘输入数据发送的整个流程: 从网络接收到udp数据包,并从udp数据包的payload中获取以太网帧,然后将以太网帧传送给

    21740

    超详细的Socket通信原理和实例讲解

    关于对 Socket 的认识,大致分为下面几个主题,Socket 是什么,Socket 是如何创建的,Socket 是如何连接并收发数据的,Socket 套接字的删除等。...,之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的套接字,套接字收到请求后,会写入相应的信息,并且把状态改为正在连接。...当所有建立连接的报文都能够正常收发之后,此时套接字就已经进入可收发状态了,此时可以认为用一根管理把两个套接字连接了起来。当然,实际上并不存在这个管子。...在这种情况下,发送缓冲区中的数据就会超过 MSS 的长度,发送缓冲区中的数据会以 MSS 大小为一个数据包进行拆分,拆分出来的每块数据都会加上 TCP,IP,以太网头部,然后被放进单独的网络包中。...由于网络环境复杂多变,所以数据包会存在丢失情况,因此发送序号和确认号也存在一定规则,TCP 会通过窗口管理确认号。断开连接当通信双方不再需要收发数据时,需要断开连接。不同的应用程序断开连接的时机不同。

    2.3K20

    12 . Python3之网络编程

    计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信。网络编程就是如何在程序中实现两台计算机的通信。...而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。...write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。...TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素...这些I/O缓冲区特性可整理如下: 1.I/O缓冲区在每个TCP套接字中单独存在; 2.I/O缓冲区在创建套接字时自动生成; 3.即使关闭套接字也会继续传送输出缓冲区中遗留的数据; 4.关闭套接字将丢失输入缓冲区中的数据

    1K40

    八股文!!

    ,最大值65535 校验和:UDP头部,UDP数据,UDP伪头部的累加校验和 udp协议的问题 面向无连接:即使对方不存在也会直接发送数据包,所有连接共用同一个缓冲区 没有流控:在接收到用户数据的那一刻原样发送出去...,接收方会被淹没 没有拥塞控制:即使出现网络拥塞,仍然会发送数据包,造成网络瘫痪 不可靠:出现丢包不会重发,无法处理数据包乱序到达的问题 思考:如何利用不可靠的udp协议来实现一个可靠的,稳定的传输控制协议...tcp放弃重传才会返回错误 如果另一端不主动写入,永远无法发现对端异常 机器崩溃并重启 机器重启后,该链接丢失,内核不会为该链接重新建立tcb数据,因此当收到该链接的数据包时,内核将响应rst报文 另一端...另一端write该套接字时将会被响应一个rst报文,再次写入时触发sigpipe信号(信号默认动作是结束进程,即使捕捉该异常,write也会得到sigpipe错误)由此也可得知对端状态变更 如果另一端不主动写入...,永远无法发现对端异常 网络断开 网络断开时,数据无法发送到对方,正常的数据通信和触发关闭链接的报文都被抑制 另一端read该套接字时,将会被挂起或得到EAGAIN错误 另一端write该套接字时将会持续重传

    1K11

    收发数据的原理(上)

    二是保存在套接字中,用来控制协议栈操作的信息。 第一类:客户端和服务器交换的控制信息,不仅是在连接时需要,包括数据收发和断开连接操作在内,整个通信过程都需要。...SYN:建立连接,当需要建立连接时,他的值为1.即SYN=1 ACK:确认连接,当ACK=1是才有效,ACK=0是此控制位无效。 FIN:断开连接,提出断开连接这一方的值为1....RST:重新建立连接,值为1时代表重新建立连接。 PSH:要求接收方将数据尽快将数据段送达应用层 上图主要介绍了TCP头部。...,然后套接字就会写入相应的信息,并把状态改成正在连接。...如果SYN为1,则表示连接成功,这时会向套接字中写入服务器的IP地址、端口号等信息,同时还会将状态改成连接完毕。到这里,客户端的操作就已经完成。

    80020

    【Python】高级笔记第五部分:网络编程

    ⭐️UDP套接字特点 可能会出现数据丢失的情况,不保证可靠 传输过程简单,实现容易 数据以数据包形式表达传输 数据传输效率较高 TCP 传输方法 ⭐️TCP传输特点 面向连接的传输服务 传输特征...关闭套接字 ⭐️TCP套接字细节 tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。...传输数据处理为字节流 处理为数据包形式 传输需要建立连接才能进行数据传,效率相对较低 UDP 比较自由,无需连接,效率较高 套接字编程区别 会有粘包 有消息边界不会粘包 依赖 listen...⭐️TCP协议首部信息 源端口和目的端口 各占2个字节,分别写入源端口和目的端口。 序号 占4字节。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。...当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

    66620

    《网络是怎么样连接的》读书笔记 - 汇总篇

    协议栈会将接收到的数据复制到应用程序指定的内存地址中,然后将控制流程交回应用程序断开连接断开连接的部分包含断开连接和删除套接字的操作,断开连接也就是经典的四次挥手的操作,而删除套接字则需要注意在协议栈中并没有规定关闭的时间...:当交换机从其某个端口收到一个数据包时,先读取包头中的源MAC地址(即发送该数据包的设备网卡的MAC地址),将该MAC地址和端口对应起来添加到交换机内存里的地址表中;然后再读取包头中的目的MAC地址,对照内存里的地址表看该...(1)创建套接字(创建套接字阶段)(2)用管道连接服务器端的套接字(连接阶段)(3)收发数据(收发阶段)(4)断开管道并删除套接字(断开阶段)服务器是将阶段(2)改成了等待连接(1)创建套接字(创建套接字阶段...首先调用 bind 将端口号写入套接字中,并且要设置端口,之后协议栈会调用accept连接,注意这时候包可能是没有到来的,如果包没有到来服务端会阻塞等待客户端的请求,一旦接收到连接就会开始响应并且进行连接操作...接下来协议栈会给等待连接的套接字复制一个副本, 然后将连接对象等控制信息写入新的套接字中,为什么这里要创建副本简单解释一下,因为如果直接使用原有的套接字连接,那么当新的客户端请求过来,就必须要再次创建新的套接字然后再次进行连接

    1.1K40

    tcpdump是在哪儿抓到的包?

    image.png 普通套接字的收包流程 先来看看,普通的套接字的收包路径在内核中是怎么样。 以最常见的以太网网卡,当网卡接口接收到了一个帧,那么接受者知道它一定包含了一个Ethernet报头。...以太网卡拥有特定的MAC地址,在监听数据帧的时候,当看到帧的目的MAC地址与自己的地址或者链路层广播地址(FF:FF:FF:FF:FF:FF)相匹配,就会通过DMA把该帧读取到内存中的ring buffer...当一个数据帧被写入到内存后,将产生一个硬件中断请求,以通知CPU收到了数据包。操作系统为了减少硬中断产生的次数,会采用一个软中断(softirq)唤醒NAPI子系统。...四层协议以较为简单的UDP为例,udp_rcv会对udp包进行合法性校验,然后查找是否有愿意接收此数据包的套接字,如果找到,__udp_queue_rcv_skb会将包放到socket的接收队列。...PF_PACKET套接字的收包流程 当创建PF_PACKET套接字时,与协议相关的数据包类型将被同时注册进ptype_all和ptype_base,接受函数为packet_rcb()。

    7.6K74

    以太网不可用于机器人控制?来看看我们的测试结果

    通过单个共享介质进行通信的节点,采用随机元素的控制方法进行仲裁访问(CSMA/CD)。当两个帧在传输期间发生冲突时,发送方退出随机超时并尝试重新传输。在多次尝试失败后,帧可以完全丢弃。...为了避免由磁盘I / O引起的停顿,主要的套接字处理程序写入一个由后台线程持久化的双缓冲结构。...此外,以太网帧的最小规格为84字节,因此UDP数据包的最小有效载荷是18字节。粗略结构图如下图所示,更多详细信息可查看以太网II、英特网协议(IPv4)和用户数据协议(UDP)。...image.png 图2 UDP / IPv4 / 以太网II帧结构 对于有效载荷较小(小于10字节)的传统自动化应用而言,虽然这种开销看起来很高,但它与智能设备通信时可以快速摊销。...当比较开销时,考虑可用带宽很重要,例如,通过千兆以太网(甚至超过100Mbit/秒)发送100字节比使用传统的基于非以太网的备选例如RS485或CAN总线发送单字节更快。

    1K40

    NIO之Channel通道(三)-DatagramChannel

    返回:当且仅当已连接此通道的套接字时才返回 true 1.5connect(SocketAddress remote) 连接此通道的套接字。...在显式地断开数据报套接字的连接或将其关闭之前,该套接字始终保持连接状态。 此方法执行的安全检查与DatagramSocket类的connect方法执行的安全检查完全相同。...IOException-如果发生其他I/O错误 1.6disconnect() 断开此通道套接字的连接。...仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。...指定者:接口WritableByteChannel中的write 参数:src-要从中检索字节的缓冲区 返回:写入的字节数,可能为零 抛出: NotYetConnectedException-如果未连接此通道的套接字

    82820

    网络拾遗之Socket

    「协议栈」是根据套接字中记录的控制信息来工作的 2.「描述符」相当于用来区分协议栈中的「多个套接字」的号码牌 3. 「MTU」:一个网络包的最大长度,以太网中一般为 1500 字节 4....「协议栈是根据套接字中记录的控制信息来工作的」 创建套接字时,首先分配一个套接字所需的「内存空间」,然后向其中写入初始状态。然后,将表示这个套接字的「描述符」告知应用程序。...这些信息不仅连接时需要,包括数据收发和断开连接操作在内,整个通信过程中都需要,这些内容在 TCP 协议的规格中进行了定义。...当从应用程序收到的数据长度超过或者接近 MSS 时再发送出去,就可以避免发送大量小包的问题了。 MTU 与 MSS ❝「MTU」:一个网络包的最大长度,以太网中一般为 1500 字节。...根据发送缓冲区中的数据拆分的情况,当判断需要发送这些数据时,就在每一块数据前面「加上 TCP 头部」,并根据「套接字中记录」的控制信息标记发送方和接收方的「端口号」,然后交给 IP 模块来执行发送数据的操作

    34920

    linux服务器开发三(网络编程) --二

    该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。 SHUT_WR(1): 关闭sockfd的写功能,此选项将不允许sockfd进行写操作。...也可选择中止一个方向的连接,只中止读或只中止写。 注意: 1、如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放。...端口复用 在server的TCP连接没有完全断开之前不允许重新监听是不合理的。...当数据包被送到输出端口时,它需要按顺序等待,以便被传送到输出链路上。 路由器在工作时能够按照某种路由通信协议查找设备中的路由表。...套接字通信原理如下图所示: ? 在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文件描述符索发送缓冲区和接收缓冲区。

    2.5K70

    Python基础21-网络编程

    而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。...,在谈及以太网协议时候,我门了解到 通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议 arp协议功能:广播的方式发送数据包,获取目标主机的...于是乎经历过四次挥手之后,就断开连接了,但是要记住,不是立马就断开连接,因为你是个渣男,所以你要付出代价,这个后果就是持续4分钟的time_wait状态,不能释放套接字资源(端口),这段时间内套接字资源...或者A、B重启、关机、手动执行断开连接的操作时,OSI会话层也会将A、B之间的会话断开。 ---- 表示层 表示层主要三大功能: 1.内码转换 2.压缩与解压缩 3.加密与解密。...不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),

    55420

    网络是如何连接的?网络发展简介(四)

    socket是操作系统提供的TCP/IP的薄层封装,大大简化了TCP/IP的使用 借助于socket通信的过程大致分为下面四个过程 创建套接字 连接阶段 通信阶段 断开阶段 web服务器会先创建套接字...,并且重新计时2MSL 而且,客户端持续2MSL时间后断开,就可以保证这个连接的所有报文都会死亡,可以看下MSL的含义,也就是2MSL之后,断开这个连接之后,肯定不会还存在这个连接的旧的报文了 上面说的过程虽然说得是...TCP模块接收-连接 当 TCP 头部中的控制位 SYN 为 1 时,表示这是一个发起连接的包。...如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方 IP 地址、端口号、序号初始值、窗口大小等必要的参数写入这个套接字中 同时分配用于发送缓冲区和接收缓冲区的内存空间。...,连接操作就完成了 TCP模块接收-传输 然后就是数据的传送阶段了 数据包重复着上面的过程,TCP 模块会检查收到的包对应哪一个连接 在服务器端,可能有多个已连接的套接字对应同一个端口号,因此仅根据接收方端口号无法找到特定的套接字

    4K50

    读书笔记之《网络是怎样连接的》

    当数据全部发送完毕之后,连接的管道将会断开,管道在连接时是由客户端发起的,但在断开的时可以由任意一方发起。...总结,收发数据的大致操作如下: 创建套接字阶段:创建套接字 连接阶段:将管道连接到服务器端的套接字上 通信阶段:收发数据 断开阶段:断开管道并删除套接字 第二章:用电信号传输 TCP/IP 数据 1)...数据拆分 发送缓冲区中的数据超出 MSS 的长度时,需要以 MSS 的长度为单位进行拆分,拆分出来的每块数据都会被放进单独的网络包汇总,根据发送缓冲区的数据拆分情况,当判断需要发送这些数据时,就在每一块数据前面加上...TCP头部,并根据套接字中记录的控制信息标记发送方和接收方的端口号,然后交给 IP 模块进行发送 4)从服务器断开并删除套接字 和服务器的通信结束之后,用来通信的套接字也就不会再使用了,这时我们就可以删除这个套接字了...收发操作小结 数据收发操作第一步便是创建套接字,一般来说服务器一方的应用程序在启动时就会创建好套接字并进入等待连接的状态。

    1.2K30

    网络是怎样连接的(二) -- 协议栈与网卡是如何工作的

    引言 上一篇文章中,我们介绍了浏览器是如何生成消息的: 网络是怎样连接的(一) -- 浏览器是如何工作的 在浏览器生成消息以后,他就要通过调用 Socket 库中的系统调用,委托操作系统协议栈将消息发送出去了...创建套接字 首先,浏览器要做的是调用 Sockect 库提供的 socket 系统调用,创建套接字,那么,什么是 socket 呢?...每一个 socket 对应协议栈内一块独立的内存空间,因此,当需要让操作系统协议栈进行连接、读写等操作时,都需要在调用 Socket 系统调用时传递 socket 作为参数,从而让协议栈可以去对应的内存空间中查询当前连接的控制信息...3.1 数据的发送 发送数据的步骤如下: 协议栈将收到的数据写入发送缓冲区; 协议栈根据 MTU(网络包最大长度)减去头部长度,得到单个包的长度,对缓冲区中的数据进行拆分,然后将拆分后的数据逐个发送,如果达到计时器时间缓冲区中仍然不足一个包...MAC 模块将以太网包从缓冲区中取出,在数据包的前后分别拼接上报头、分隔符和校验序列,从而形成一个互联网帧。

    1.3K40
    领券