본문 바로가기
728x90

츄Log/네트워크 프로그래밍 끄적7

TCP 연결 종료시 상태 전이 안녕하세요! 오늘은 TCP 연결 종료시의 상태를 한 번 살펴보려고 합니다. 대표적인 클라이언트와 서버 입장에서의 전이만 표현했습니다. 전체적인 TCP 상태 전이는 다른 포스팅에서 작성해보겠습니다. 아래 발그림을 같이 보겠습니다. 보통 Client가 연결 종료를 시작하는 Active Close를 하게 됩니다. 그렇다면 서버는 연결 종료 시작을 받는 Passive Close를 하게 됩니다. 클라이언트는 FIN을 보내고 ACK를 받으면서 FIN_WAIT_1 -> FIN_WAIT_2 상태로 들어가게 됩니다. 이 때, 서버로부터 FIN이 오기 전까지 클라이언트는 half-close 상태로 계속해서 데이터를 수신할 수 있습니다. (물론 half-close를 할 수 있도록 프로그래밍 해야하며, half-close에 .. 2023. 12. 13.
EchoServer/Client TCP 패킷 분석 - 1. 연결/연결 종료 (Wireshark) 안녕하세요! 오늘은 echo server를 만들고 wireshark로 이것저것 해본 경험을 기록하려고 합니다. netty를 공부하고 있어서 netty로 echo server/client 만들었습니다. java socket으로 만드는 것과 차이는 없을 것이라 생각됩니다. 오늘은 일반적인 서버와 클라이언트의 흐름인 연결/송수신/종료 3가지 경우를 살펴보려고 합니다. server port : 8888 client port : 51214 1. 연결모두가 다 아는 그 과정, 3-way handshake 입니다. 클라이언트가 서버로 [SYN] 패킷을 보내면서 연결이 시작되고 서버는 [SYN,ACK] 를 보내고 클라이언트도 [ACK]를 보내 연결을 수립합니다. 이 시점에 netstat을 통해 네트워크 상태도 한 번 .. 2023. 12. 12.
TCP 소켓의 TIME_WAIT 상태는 왜 있는 것일까? 안녕하세요! 오늘은 소켓의 TIME_WAIT상태에 대해 알아보겠습니다. 기본적으로 TCP 통신이라고 하면 "연결 지향"이라는 말이 나오고 "연결"이라는 개념이 나왔다면 서버와 클라이언트를 떠올릴 수 있습니다. 서버와 클라이언트는 연결을 맺고 데이터를 송수신 하다가 연결을 끊게 됩니다. 연결을 끊을 때 four -way handshaking을 하게 되는데요. (four-way handshaking은 따로 설명하지 않겠습니다.) 이 때 먼저 연결을 끊은 측에서 TIME_WAIT 상태에 들어가게 됩니다. 클라이언트 소켓이 TIME_WAIT 상태에 들어가는 것이 아니고, 서버 소켓이 TIME_WAIT 상태에 들어가는 것이 아니고, 누구랄 것 없이 먼저 종료를 요청한 소켓이 TIME_WAIT상태에 들어가게 됩니다.. 2023. 12. 8.
Java NIO (New IO) 안녕하세요! 오늘은 java NIO의 개념을 간단하게 정리해보려고 합니다. 자바 1.4이전의 IO(Old IO로 OIO라고 함)는 운영체제 수준의 시스템콜을 직접 사용할 수 없었습니다. 왜 OIO는 느렸을까요? 운영체제 시간에 배운 것처럼 모든 IO는 반드시 커널 영역을 직간접적으로 거쳐야 합니다. 커널 영역에 저장된 데이터는 JVM의 버퍼로 다시 복사를 해야 합니다. 디스크에서 커널 영역의 버퍼로 데이터를 저장하는 것은 디스크 컨트롤러가 DMA라는 기술을 사용하여 CPU의 도움 없이 처리하지만, 커널 영역의 버퍼에서 프로세스 영역의 버퍼로 데이터를 전달하는 것은 CPU를 사용합니다. 또한 디스크에서 커널 영역의 버퍼로 데이터를 복사하는 동안 프로세스는 블록킹됩니다. 이런 문제점으로 시스템콜을 직접 사용.. 2023. 11. 29.
Netty - 2. 핵심 구성 요소(채널, 채널파이프라인, 이벤트, 핸들러) 안녕하세요. Netty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크로 만들어주는 핵심 구성 요소를 알아보겠습니다. 1. Channel & Channel Pipeline Netty의 채널은 이름처럼 Java의 NIO를 기반으로 합니다. 채널은 네트워크 소켓이나 read, write, connect, bind 같은 I/O작업을 수행할 수 있는 컴포넌트와 연결할 수 있는 연결점 입니다. 이 채널에서 발생한 모든 이벤트는 채널파이프라인을 따라 이동합니다. 2. Event & Handler Netty는 네트워크 송수신에 관련된 일련의 일들을 각종 이벤트로 추상화했습니다. 채널에서 발생하여 채널 파이프라인을 따라 흐르는 이벤트를 처리하는 인터페이스가 핸들러입니다. 네티는 이벤트를 인바운드 이벤트(Inbou.. 2023. 11. 29.
Nagle's Alghorithm (네이글 알고리즘) Nagle의 알고리즘은 TCP/IP 데이터 전송에 사용하는 알고리즘입니다. Nagle의 알고리즘은 네트워크를 통해 전송해야 하는 패킷 수를 줄여 TCP/IP 네트워크의 효율성을 향상시키는 수단입니다. 이 알고리즘의 핵심은 '가능하면 데이터를 나누어 보내지 말고 한꺼번에 보내라'는 원칙을 기반으로 합니다. small-packet problem (소형 패킷 문제)이 있습니다. 키 누른 것이 바로 전송되는(Telnet세션 같은) 애플리케이션은 크기가 1바이트에 불과한 작은 청크를 반복적으로 내보내는데요, 이 때 TCP 패킷에는 40바이트의 헤더가 있으므로, 1바이트의 청크에는 41바이트의 패킷이 생성됩니다. 그러므로 이런 반복적인 소형 패킷의 전송에 엄청난 오버헤드를 발생시키게 됩니다. 이런 문제를 방지하기 .. 2023. 11. 27.
Netty - 1. 개요 안녕하세요! 오래 전부터 관심이 있던 Netty 공부를 시작하게 되었습니다. 하나씩 차근차근 공부해봅시다! Netty 공식홈페이지에 대문짝만하게 써진 글이 있습니다. Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크로, 유지보수 가능한 고성능 프로토콜 서버&클라이언트를 빠르게 개발할 수 있다. 여기에 Netty의 핵심 키워드가 모두 들어간 것 같습니다. 비동기 : Netty는 리액터 패턴을 통해 비동기 호출을 위한 API를 .. 2023. 11. 24.
728x90