TCP/IP
selfimpr1991
这个作者很懒,什么都没留下…
展开
-
【Unix 网络编程】说说 socket 套接字
套接字描述符同文件描述符一样是一个整数类型的值,是通信端点的抽象。对于每个程序系统都有单独的表,精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者。为了将不同类型的 IO 与对应的文件描述符绑定,则需要不同的初始化函数,这相当于面对对象里面的多态。普通文件就通过 open 函数,指原创 2014-03-23 16:32:09 · 2736 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】connect 函数剖析(一)
TCP客户用 connect 函数来建立与 TCP 服务器的连接,其实是客户利用 connect 函数向服务器端发出连接请求。1、应用层——connect 函数#include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);/*sockfd是由socket函数返回的套接口描述字,第原创 2015-07-02 09:17:03 · 5218 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】socket 函数剖析
深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来。原创 2015-07-01 12:43:57 · 7030 阅读 · 4 评论 -
【Linux 内核网络协议栈源码剖析】ARP地址解析协议
ARP地址解析协议理论前篇参见ARP与RARP,这里则通过源码(Linux kernel 1.2.13;net\inet\arp.c)来剖析其内部原理及实现过程。原创 2015-07-09 20:54:20 · 6872 阅读 · 2 评论 -
【计算机网络】详解网络层(二)ARP和RARP
ARPARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过物理网络发送。因此发送方还需要有接收方的物理地址,也就需要一个从IP地址到物理地址的映原创 2015-03-12 19:40:39 · 9862 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】listen 函数剖析
listen 函数仅供服务器端调用,把一个未连接的套接字转换为一个被动套接字,指示内核应接受指向该套接字的连接请求。1、应用层——listen 函数#include int listen(int sockfd, int backlog);/*sockfd是bind之后的套接口描述字,第二个参数规定了内核应该为相应套接口排队的最大连接个数*/2、BSD Socket 层——sock_li原创 2015-07-01 18:48:15 · 2910 阅读 · 0 评论 -
TinyHTTPd--超轻量型Http Server源码分析
TinyHTTPd是一个超轻量型Http Server,使用C语言开发,全部代码不到600行,附带一个简单的Client,可以通过阅读这段代码理解一个Http Server的本质。源码下载链接http://sourceforge.net/projects/tinyhttpd/分析这段源码前,需要对网络协议,Unix编程,以及HTTP有一定的了解,这里假设大家对http有一定的了解,如果有时原创 2015-05-27 13:14:34 · 8325 阅读 · 7 评论 -
【Linux 内核网络协议栈源码剖析】accept 函数剖析
好,tcp 协议建立连接的几个函数到这,就还差个accept 函数,这里直接贴代码了,不再向前面那般赘述了。一、应用层——accept 函数该函数返回一个已建立连接的可用于数据通信的套接字。#include int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);//返回:非负描述子——成功,-1——原创 2015-07-07 21:55:56 · 4651 阅读 · 1 评论 -
【Linux 内核网络协议栈源码剖析】connect 函数剖析(二)
网络层——ip_build_header 函数前篇(跳跃有点大,记得理清思路找到被调用位置,参见connect(一))介绍的 tcp_connect 函数内部调用了 build_header函数,实则是ip层的 ip_build_header 函数,该函数的主要功能是创建合适的 mac和ip头部/* * This routine builds the appropriate hard原创 2015-07-07 15:14:03 · 2082 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】sendto 函数剖析
前面介绍的函数基本上都是TCP协议的,如listen,connect,accept 等函数,这都是为可靠传输协议TCP定制的。对于另一个不可靠udp协议(通信系统其可靠性交由上层应用层负责),则主要由两个函数完成,sendto 和 recvfrom 函数。这里先介绍 sendto 函数。对于 udp 协议的介绍和编程实现请参考下文:UDP 客户/服务器简单 Socket 程序简要介绍下UD原创 2015-07-16 10:24:43 · 12766 阅读 · 5 评论 -
【Linux 内核网络协议栈源码剖析】recvfrom 函数剖析
继前篇介绍完sendto 数据发送函数后,这里介绍数据接收函数 recvfrom。一、应用层——recvfrom 函数对于这个函数有必要分析一下,先看看这个dup例子。服务器端中调用recvfrom函数,并未指定发送端(客户端)的地址,换句话说这个函数是一个被动函数,有点类似于tcp协议中服务器listen 之后阻塞,等待客户端connect。这里则是服务器端recvfrom后,等待客户端原创 2015-07-16 19:14:26 · 16415 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】系统网络协议栈初始化及数据传输通道建立过程
本文先大致阐述系统协议栈初始化过程,然后剖析数据包的接收和发送通道过程,在文章最后着重梳理其过程及通道结构区别。 源码版本:Linux kernel 1.2.13;工具:Source Insight 3.5 下图为网络协议栈初始化程序流程框架 本篇幅将根据上图来介绍系统网络协议栈的初始化过程。 先从init/main.c 文件出发,在执行了一系列涉及到具体处理器架构初始化代码原创 2015-08-24 19:51:02 · 3323 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】数据包发送
release_sock 函数是在 sock.c中//如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收//数据包要插入receive_queue中才能算真正完成接收//release_sock函数则是从back_log中取数据包重新调用tcp_rcv函数对数据包进行接收void release_sock(struct sock *sk)原创 2015-07-06 10:53:12 · 4817 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】socket.c——BSD Socket层(1)
写在前面:本系列文章先把各个层对应的文件源码剖析一遍,最后再穿插起来,理清整个协议栈网络数据包的上下传送通道,从整体实现上进行把握。这里主要是介绍BSD socket层对应 socket.c 文件中的函数。原创 2015-06-18 12:59:44 · 6187 阅读 · 0 评论 -
【TCP/IP】TCP协议
TCP是TCP/IP体系结构中最主要的传输层协议,它只提供面向连接的传输服务。TCP具备一下特性:1、面向连接的传输协议。应用程序在使用TCP之前,必须先建立TCP传输连接,在传输数据完毕后,必须释放已建立的TCP传输连接。2、仅支持单播传输。每条TCP传输连接只能有两个端点(socket),只能进行点对点的数据传输。3、提供可靠的传输服务。通过TCP连接传送的数据可以无差错。不丢原创 2015-04-02 19:47:29 · 2241 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】bind 函数剖析
bind 函数主要是服务器端使用,把一个本地协议地址赋予套接字。1、应用层——bind 函数#include int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);/*sockfd是由socket函数返回的套接口描述字,第二个参数是一个指向特定于协议的地址结构的指针,第三个参数是该地址结构的长度*原创 2015-07-01 16:52:26 · 3381 阅读 · 1 评论 -
【Linux 内核网络协议栈源码剖析】数据包接收(含TCP协议状态变换)
接前文connect 函数剖析(一)接收数据包函数,release_sock 函数是在 sock.c中,该函数是在 inet socket 层,其内部的数据结构为 sock 结构该函数被 tcp_connect 函数最后调用,用于接收数据包//如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收//数据包要插入receive_queue原创 2015-07-07 21:39:28 · 4925 阅读 · 0 评论 -
【Unix 网络编程】TCP 客户/服务器简单 Socket 程序
前面介绍了Socket 编程函数 在编写 Socket 程序之前还需要了解TCP连接是如何建立的。(参考资料《Unix 网络编程》)建立一个 TCP 连接时会发生下述情形:1. 服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这三个函数来完成,我们称之为被动打开。2. 客户通过调用 connect 发起主动打开,这导致客户TCP发送一个SYN原创 2014-03-20 19:25:43 · 3158 阅读 · 0 评论 -
【Unix 网络编程】服务器网络编程模型——多进程并发模型
在介绍多进程并发模型前,先看看之前的一个TCP socket 例子,一个同步阻塞迭代模型。其服务器端核心代码如下,完整代码参见前面链接,同步阻塞迭代服务器模型:原创 2014-10-23 19:16:41 · 1746 阅读 · 0 评论 -
【Unix 网络编程】服务器网络编程模型——多线程并发模型
在多进程并发模型中,每一个客户端连接就需要fork 一个进程,fork 代价是昂贵的,fork 要把父进程的内存映像拷贝到子进程,并在子进程中复制所有描述字,如此等等,尽管当今的实现使用称为写时拷贝的技术,用以避免在子进程切实需要自己的拷贝之前把父进程的数据空间拷贝到了子进程。然而即便有这样的优化措施,fork 的代价仍然是昂贵的。另外fork 返回之后父子进程之间信息的传递需要进程间通信(IPC)机制。原创 2014-10-29 16:10:02 · 1553 阅读 · 0 评论 -
【Unix 网络编程】UDP 客户/服务器简单 Socket 程序
UDP 是无连接不可靠的数据包协议,不同于 TCP 提供的面向连接的可靠字节流。在介绍UDP编程模型前,先介绍UDP协议中两个重要的函数:sendto 和 recvfrom。原创 2014-10-13 21:03:24 · 2668 阅读 · 0 评论 -
【Unix 网络编程】TCP状态转换图详解
在前面,已经介绍了TCP协议的三路握手和四次挥手。如下图所示,TCP通信过程包括三个步骤:建立TCP连接通道(三次握手)、数据传输、断开TCP连接通道(四次挥手)。原创 2014-10-21 21:50:35 · 44306 阅读 · 6 评论 -
【计算机网络】传输层
传输层与数据链路层的作用都是建立数据传输通道,两者在功能上存在许多相似之处。传输层的功能主要体现在广域网网络应用中,可以吧数据链路层当做局域网通信的数据传输通道,而传输层则是广域网中的数据传输通道。传输层是整个广域网网络体系结构模型的核心所在,以为它负责端到端的通信,是两台计算机系统经过网络进行数据通信时第一个端到端的层次。1、概述传输层是面向通信部分的最高层,与下面的三层(物理层、数原创 2015-03-16 20:42:30 · 2805 阅读 · 0 评论 -
【Unix 网络编程】服务器网络编程模型——I/O复用:select 函数
I/O复用是指内核一旦发现进程指定的一个或多个I/O条件就绪,它就通知该进程。I/O复用主要用于网络应用,典型使用在一下场合:1.当客户处理多个描述字(通常是交互式输入和网络套接口)时,必须使用I/O复用;2.一个客户同时处理多个套接口时;3.如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般就要使用I/O复用;4.如果一个服务器既要处理TCP,又要处理UDP,一般就要使用I/O复用;5.如果一个服务器要处理多个服务器或者多个协议,一般就要使用I/O复用。I/O复用,先构造一张有原创 2014-04-12 09:27:10 · 1612 阅读 · 0 评论 -
【TCP/IP】TCP的三次握手和四次挥手
传输控制协议(TCP)是一种面向连接的协议,网络程序使用这个协议的时候,网络可以保证客户端和服务端的连接是可靠的,安全的。如果 A机向 B机发送“hello”,在物理网线上传输的数据不仅仅是“hello”这5个字符,其实除了hello(被称为有效载荷)之外,还必须有用于TCP/IP协议进行处理所需要的其他很多内容。这其中与socket 编程相关的最主要有4 个东西:A机 IP地址(源IP)、B的 IP地址(目标IP)、A机端口号(源端口)、B机端口号(目标端口)。目标IP用来使数据包能到达指定的目标机,源原创 2014-10-04 14:20:13 · 4714 阅读 · 1 评论 -
【计算机网络】数据链路层(二):差错检测和纠正
帧同步虽然可以区分每个数据帧的起始和结束,但是还没有解决数据正确传输的两方面问题:一、如果有帧出现了错误?二、如果有帧丢失了?这都是数据链路层确保向网络层提供可靠数据传输服务解决的问题,也就是数据链路层的差错控制功能。要实现差错控制功能,就必须具备两种能力:一是具备发现差错的能力,二是具备纠正错误的能力。一、差错检测在数据链路层检测数据传输错误的方法一般是通过对差错编码进行校验来实现,原创 2015-03-24 21:59:26 · 25972 阅读 · 3 评论 -
【计算机网络】详解网络层(一):数据包封装和报文格式
网络层是网络体系结构中非常重要的一层,在技术上又是非常复杂的一层。网络层是从功能上定义的一个逻辑层次,与物理层和数据链路层有具体的设备支持一样,网络层也有具体的设备来完成其相关人物,最典型的就是我们常用的路由器(Router)。路由器就相当于连接不同城市公路的中转车站,起数据中转作用。网络层介于传输层和数据链路层之间,其主要作用是实现两个网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际原创 2015-03-07 20:09:24 · 37495 阅读 · 1 评论 -
【计算机网络】数据链路层(一):数据帧和物理寻址
本博文较为详细的介绍数据链路层的各个方面。在网络协议中的位置及其作用,包括数据帧封装,差错检测,差错纠正及流量控制等方面。并涉及到网络协议各层的数据封装以及网络通信中数据传输通道的简要分析。这算是对数据链路层的一个详细的学习笔记原创 2015-02-16 14:49:40 · 26939 阅读 · 8 评论 -
【TCP/IP】IP:网际协议(寻址和路由)
IP是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠、无连接的数据报传送服务。不可靠是指它不能保证IP数据报能成功地到达目的地,IP仅提供最好的传输服务,如果期间数据传输发生了错误,IP的处理算法是:丢弃该数据报,然后发送ICMP(IPv4协议簇中的一个子协议,用于在IP主机、路由器之间传递控制消息,控制消息是指网络通原创 2015-03-24 19:01:37 · 12198 阅读 · 0 评论 -
【Unix 网络编程】TCP Socket 编程基础(0)
一、套接口地址结构 IPv4 套接口地址结构struct in_addr{ in_addr_t s_addr; /*32-bit IPV4地址*/}; /*网络字节序*/struct sockaddr_in{ uint8_t sin_len; /**/ sa_family_t sin_family原创 2014-03-17 14:45:39 · 2812 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关于网络栈中数据包的状态,地址,端口等信息都封装在对应的结构中,可以说,了解这些数据结构是理解网络栈源码的基础,这里我们就来了解下网络协议栈中的各类数据结构。1、socket该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少。/* *原创 2015-06-30 20:42:11 · 5705 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】af_inet.c——INET Socket层(2)
前篇 socket.c 介绍的是BSD socket 层的函数。应用系统的函数调用如socket、bind、listen、accept、connect 等函数,将通过共同的入口函数 sys_socket 调用BSD socket层的对应系统调用函数,如sock_socket、sock_bind、sock_listen、sock_accept、sock_connect 等函数(socket.c)。从前面分析得知, sock_ 函数内部又将调用下一层的函数实现,而这些下层函数就是 af_inet.c 文件中定义原创 2015-06-18 21:43:31 · 3527 阅读 · 0 评论