UNIX 网络编程笔记-CH2:TCP、UDP概貌

好久不读不用又忘得差不多了,还是感叹Richard Stevens真是太刁,25年前第一版。

"Tcp state diagram fixed new" by Scil100. Licensed under CC BY-SA 3.0 via Wikimedia Commons - http://commons.wikimedia.org/wiki/File:Tcp_state_diagram_fixed_new.svg#/media/File:Tcp_state_diagram_fixed_new.svg

TCP连接建立:

TCP连接断开:

TIME_WAIT:

为MSL(maximum segment lifetime)的两倍,(a)可靠的实现TCP全双工连接的终止。如果最后一个ACK在路上丢了,那么被动关闭端又会再发一次FIN,并期望得到一个ACK。如果没有TIME_WAIT这个等待时间的话,主动关闭端在收到重发的FIN前就关闭了自己的socket,那么对方重发FIN后会得到一个RST。这样一来关闭工作就只进行了一半(单方面的),而没有双向进行。(b)由于TIME_WAIT的时间是MSL的两倍,使得某个方向上的分组最多存活MSL秒就被丢弃,另一方向上的应答最多存活MSL也被丢弃。这样当相同的四元组再建立连接时,其数据包不会和以前的那次连接混合起来。在TIME_WAIT时间范围TCP也必须防止建立与该连接相同的四元组连接。

TCP输出(write返回的含义):

当使用阻塞的write进行TCP数据发送时,如果所要写入的数据比套接字发送缓冲区中空余空间多,则进程将被投入睡眠。当用户数据全部被复制到发送缓冲区后,write返回。因而TCP套接字使用write返回并不代表着数据已经发送或者已经到达对方,而只是说明数据已经全部被复制到套接字发送缓冲区中了。可以使用SO_SNDBUF来更改套接字缓冲发送缓冲区大小。发送缓冲区的数据进过TCP,IP等协议封装到达数据链路层的发送队列,如果此时队列已满,则逐层向上传递错误,TCP将在以后某个时刻重传相应的分节。本端TCP必须在得到对端的数据接收ACK信息后才能把自己的曾经发送的数据清除。

UDP输出(write返回的含义):

UDP也可以通过SO_SNDBUF指定一个大小,但该值只是规定UDP报文的大小上限。UDP并没有如TCP那样的真实发送缓冲区,在报文发送后数据就被链路层丢弃了。从一个UDP的write返回意味着所写的数据报或其所有片段已经被加入链路层的输出队列。

时间: 2024-08-02 10:55:12

UNIX 网络编程笔记-CH2:TCP、UDP概貌的相关文章

Unix网络编程之基本TCP套接字编程(上)

TCP客户/服务器实例 服务器程序 #include "unp.h" int main(int argc, char **argv) { int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); //1 bzero(&servaddr, sizeof(servad

UNIX网络编程笔记(4)—TCP客户/服务器程序示例

TCP客户/服务器程序示例 这一章信息量开始大起来了,粗略来看它实现了简单的TCP客户/服务器程序,里面也有一些费解的细节. 1.概述 完整的TCP客户/服务器程序示例.这个简单的例子将执行如下步骤的一个回射服务器(这里的回射服务器就是服务简单的把客户端发送的消息返回给客户): 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 这样实际上就构成了一个全双工的TCP连接. 本章就围绕了这个简单的TC

UNIX网络编程笔记(1)—传输层协议

开始学习网络编程的经典<UNIX网络编程>(第3版)作为研究生阶段的副本练习吧,厚厚一本书,希望能坚持看下去,坚持做些笔记. 1.TCP/IP协议概述 IPv4 网际协议版本4(Internet Protocol version 4),32位地址,为TCP.UDP.SCTP.ICMP和IGMP提供分组递送服务. IPv6 网际协议版本6(Internet Protocol version 6).128位地址,为TCP.UDP.SCTP和ICMPv6提供分组递送服务. TCP 传输控制协议(Tr

UNIX网络编程笔记(2)—套接字编程简介

套接字编程概述 说到网络编程一定都离不开套接字,以前用起来的时候大多靠记下来它的用法,这一次希望能理解一些更底层的东西,当然这些都是网络编程的基础- (1)套接字地址结构 大多说套接字函数都需要一个指向套接字地址结构的指针作为参数,每个协议族都定义它自己的套接字地址结构,这些结构都以sockadd_开头. IPV4套接字地址结构 IPv4套接字地址结构通常称为"网际套接字地址结构",以sockaddr_in命名,并定义在 /* Internet address. */ typedef

UNIX网络编程笔记(3)—基本TCP套接字编程

基本TCP套接字编程 主要介绍一个完整的TCP客户/服务器程序需要的基本套接字函数. 1.概述 在整个TCP客户/服务程序中,用到的函数就那么几个,其整体框图如下: 2.socket函数 为了执行网络I/O,一个进程必须要做的事情就是调用socket函数.其函数声明如下: #include <sys/socket.h> int socket(int family ,int type, int protocol); 其中: family:指定协议族 type:指定套接字类型 protocol:指

UNIX网络编程笔记(6)—UDP网络编程

基本UDP套接字编程 1. 概述 TCP和UDP的本质区别就在于:UDP是无连接不可靠的数据报协议,TCP是面向连接的可靠字节流.因此使用TCP和UDP编写的应用程序存在一些差异.使用UDP编写的一些常见的应用程序有:DNS(域名解析系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 2. sendto和recvfrom函数 类似与标准的read和write函数: #include <sys/socket.h> ssize_t recvfrom (int sockfd,void *

unix网络编程笔记(一)

第三章笔记 1. 套接字地址: 1.1 分类: 套接字地址分两种,一种是通用套接字地址类型struct sockaddr,它只是为了在套接字函数中可以传入任意套接字地址而定义的结构体,功能类似于void*,而出现定义套接字函数时还没有出现void*,所以才定义了该结构体.sockaddr 使用unsigned short int sa_family 来表明具体地址类型.另一种是具体协议的套接字地址类型,如果需要具体的套接字地址类型,需要使用sockaddr_in(IPv4)或sockaddr_i

UNIX 网络编程笔记-CH3:套接字编程简介

IPv4套接字地址结构 struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; /* length of structure (16) bytes */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16-bit TCP/UDP port, network byte order(big-endian) */ struct in

Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API,包括"套接字的地址结构"."字节排序函数"等.这些API几乎是所有的网络编程中都会使用的一些,对于我们正确的编写网络程序有很大的作用.在本节中我们会介绍编写一个基于TCP的套接字程序需要的一些API,同时会介绍一个完整的TCP客户服务器程序,虽然这个程序功能相对简单,但确包含了一个客户服务器程序所有的步骤,一些复杂的程序也都是在此基础上进行扩充.在后面随着学习的深入,我们会给这个程序添加功能. 下面