getsockopt的TCP層實現剖析

2021-06-27 22:44:52 字數 3947 閱讀 2858

name

getsockopt - get options on sockets

synopsis

#include

#include

int getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);

函式的呼叫關係圖如下:

核心版本:2.6.37

int tcp_getsockopt (struct sock *sk, int level, int optname, char __user *optval, int __user *optlen)

static

int do_tcp_getsockopt (struct sock *sk, int level, int optname, char __user *optval, int __user *optlen)

case tcp_quickack:

val = ! icsk->icsk_ack.pingpong; /* 快速確認模式 */

break;

case tcp_congestion:

if (get_user(len, optlen))

return -efault;

len = min_t(unsigned

int, len, tcp_ca_name_max); /* 16 bytes */

if (put_user(len, optlen)

return -efault;

if (copy_to_user(optval, icsk->icsk_ca_ops->name, len)) /* 預設為cubic */

return -efault;

return

0; case tcp_cookie_transactions :

...case tcp_thin_linear_timeouts:

val = tp->thin_lto; /* 預設為0 */

break;

case tcp_thin_dupack:

val = tp->thin_dupack; /* 預設為0 */

break;

case tcp_user_timeout:

val = jiffies_to_msecs(icsk->icsk_user_timeout);

break;

default:

return -enoprotoopt;

}if (put_user(len, optlen))

return -efault;

if (copy_to_user(optval, &val, len))

return -efault;

return

0;}

static

inline

int keepalive_time_when(const

struct tcp_sock *tp)

static

inline

int keepalive_intvl_when(const

struct tcp_sock *tp)

static

inline

int keepalive_probes(const

struct tcp_sock *tp)

/* return information about state of tcp endpoint in api format. */

void tcp_get_info(struct sock *sk, struct tcp_info *info)

if (tp->ecn_flags & tcp_ecn_ok)

info->tcpi_options |= tcpi_opt_ecn; /* ecn選項使用與否 */

info->tcpi_rto = jiffies_to_usecs(icsk->icsk_rto); /* rto,單位微秒 */

info->tcpi_ato = jiffies_to_usecs(icsk->icsk_ack.ato); /* predicted tick of soft clock */

info->tcpi_snd_mss = tp->mss_cache; /* 本端mss */

info->tcpi_rcv_mss = icsk->icsk_ack.rcv_mss; /* 對端mss */

if (sk->sk_state == tcp_listen) else

info->tcpi_lost = tp->lost_out; /* 丟失的資料報數 */

info->tcpi_retrans = tp->retrans_out; /* 重傳的資料報數 */

info->tcpi_fackets = tp->fackets_out; /* facked的資料報數 */

info->tcpi_last_data_sent = jiffies_to_msecs(now - tp->lsndtime); /* 最近一次發資料報的時間間隔 */

info->tcpi_last_data_recv = jiffies_to_msecs(now - icsk->icsk_ack.lrcvtime); /* 最近一次收資料報的時間間隔 */

info->tcpi_last_ack_recv = jiffies_to_msecs(now - tp->rcv_tstamp); /* 最近一次收ack包的時間間隔 */

info->tcpi_pmtu = icsk->icsk_pmtu_cookie; /* last pmtu seen by socket */

info->tcpi_rcv_ssthresh = tp->rcv_ssthresh; /* current window clamp*/

info->tcpi_rtt = jiffies_to_usecs(tp->srtt) >> 3; /* 平滑的rtt */

info->tcpi_rttvar = jiffies_to_usecs(tp->mdev) >> 2; /* 四分之一mdev */

info->tcpi_snd_ssthresh = tp->snd_ssthresh;

info->tcpi_snd_cwnd = tp->snd_cwnd;

info->tcpi_advmss = tp->advmss; /* 本端能接受的mss上限,在建立連線時用來通告對端 */

info->tcpi_reordering = tp->reordering; /* 沒有丟包時,可以重新排序的資料段數 */

info->tcpi_rcv_rtt = jiffies_to_usecs(tp->rcv_rtt_est.rtt) >> 3; /* 作為接收端,測出的rtt值 */

info->tcpi_rcv_space = tp->rcvq_space.space; /* 接收快取的大小 */

info->tcpi_total_retrans = tp->total_retrans; /* 本連線的總重傳個數 */

}

zhangskd @ csdn blog

運輸層筆記 TCP

tcp ip tcp 流量控制 差錯控制 擁塞控制 tcp報文段 程序到程序的通訊 流交付服務。全雙工通訊 復用和分用 面向連線的服務。兩個tcp之間建立虛連線,而不是物理連線。可靠的服務 編號系統 tcp是面向位元組的,所以首部中的序號和確認號字段所指的都是位元組的編號 流量控制 tcp能夠使用面...

傳輸層 TCP協議

1 序號 在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號,本欄位表示本報文段所傳送資料的第乙個位元組的序號。2 確認號 期望收到對方下乙個報文段的第乙個資料位元組的序號。若確認號為n,則證明到序號n 1為止的所有資料都已正確收到。即採用累計確認 3 資料偏移 首部長度 tcp 報文段的...

傳輸層TCP協議

面向連線,可靠傳輸,面向位元組流 tcp協議 面向連線 accept 獲取新連線 1.當呼叫accept之後,核心就會為新連線建立乙個套接字描述符,服務端使用該套接字描述符進行和客戶端進行資料通訊 2.連線建立之後,雙方都可以傳送資料 確認msg1 確認的行為是傳輸層tcp協議的行為,不是應用層的行...