기술 용어
Ctrl + F
로 찾아보는 것을 권한다.
목차
NETWORK
MTU, MSS
애플리케이션에서 데이터를 만들어 보낼 때 1~4계층에서
네트워크 상황에 맞게 데이터를 잘 쪼개 상대방에게 전달함.
네트워크에서 수용할 수 있는 크기를 역산정해 데이터가 4계층으로 내려올 때
적절한 크기로 쪼개질 수 있도록 유도하는데 이 값을 MSS(Maximum Segment Size)라고 함.
네트워크에서 한 번에 보낼 수 있는 데이터 크기를 MTU(Maximum Transmission Unit)라고 부르며
일반적인 이더넷에서 수용할 수 있는 크기는 1,500바이트.(Jumbo Frame 제외).
MTU와 MSS는 모두 데이터 크기를 지칭하는 것이므로 MTU값은 2계층의 데이터값,
MSS는 4계층에서 가질 수 있는 최대 데이터 값이다.
2계층에서는 2계층 헤더들의 크기를 제외한 데이터 크기를 MTU 크기라고 부른다.
IP헤더와 TCP 헤더의 표준 헤더 크기는 일반적으로 각각 20바이트(추가되는 옵션 헤더 제외)이므로
일반 이더넷인 경우, MSS 값을 1,460바이트로 사용합니다.
출처 : https://watermelon-sugar.tistory.com/29
LANG
C
댕글링 포인터
해제된 메모리 영역을 가리키는 포인터
아래와 같은 예제와 비슷하게 alloc된 메모리 주소의 특정 위치(index)를 가리키는 포인터(world_start_index
)를 따로 만들었다면 string
포인터가 해제되는 시점에 world_start_index
포인터는 댕글링 포인터가 된다 (위험한 코드).
이러한 댕글링 포인터를 만들지 않기 위해 free 함수 또한 wrapping 하여
하기 예제외 같이 nfree
를 실행할 경우 포인터 또한 같이 NULL로 변경해준다.
따라서 하나의 주소를 다른 두 개 이상의 포인터가 참조하는 일은 피해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define nfree(_p) if((_p) != NULL) { free((_p)); (_p) = NULL; }
// #define nfree(_p) (((_p) != NULL) ? (free((_p)), (_p) = NULL) : ((void *)0))
char * string_alloc(size_t size) {
char *ptr = (char *)xmalloc(size);
memset(ptr, 0, size);
return ptr;
}
char *string = string_alloc(20);
memcpy(string, "hello world", 11);
char *world_start_index = string + 6;
nfree(string);
// code...
printf("%s\n", world_start_index); // ??????