TCP-IP Deep Dive
overview
TCP/IP 송수신 원리: 데이터가 네트워크를타고 이동하는 여정
소켓통신은 파일 시스템과 유사하게 읽기(Receive)와 쓰기(Send)로 구성되며, 파일을 조각내어 읽고 쓰듯이, 네트워크 데이터도 작은단위로 분할되어 이동됨
3-way handshake: 연결의 시작
TCP는 신뢰성 확보를 위해 위처럼 시작전 3단계 확인과정을 거침
- SYN: 클라이언트가 서버에 연결을 요청
- SYN_ACK: 서버는 요청을 승낙, 클라이언트에 응답
- ACK: 클라이언트는 서버의 응답을 확인후, 연결을 진행
데이터 전송 프로세스
graph TD
A[애플리케이션 데이터] -->|1. 조각내기| B[세그먼트]
B -->|2. 포장| C[패킷]
C -->|3. 배송준비| D[프레임]
D -->|4. 물리전송| E[비트스트림]
- 세그먼트화
- Maximum Segment Size로 분할(64KB)
- TCP 헤더 추가(발신지/목적지 포트, 시퀀스 번호)
- 패킷화(Network Layer)
- IP 헤더 추가(발신지/목적지 IP주소)
- 라우팅 경로 설정
- 프레임화(Data Link)
- Mac 주소 정보 추가
- Beat Stream(Physical)
- 전기 신호 변환
조각된 세그먼트들이 패킷에 담기고, 패킷들은 프레임에담겨 목적지로 전송된다. 이때, 프레임에는 ACK패킷도 담겨있으며, ACK 패킷에는 다음 데이터를 얼마나 받을 수 있는지 정보를 포함 클라이언트에서 서버로
Window Size
Window Size == 얼마만큼 데이터를 보낼 수 있는가? 계산식: 윈도우사이즈 = 수신 가능 공간 - 처리 대기 데이터 ACK 패킷에 슬라이딩 윈도우 매커니즘 - 수신측의 버퍼상태 실시간 반영 - 동적 크기 조절(얼마만큼 보낼 수 있는가?) ==
3-way handshake step
TCP 연결은 3-way handshake 과정을 통해 설정되며 이 과정은 클라이언트와 서버 간의 신뢰할 수 있는 연결을 보장
- SYN: 클라이언트가 서버에 연결을 요청
- SYN_ACK: 서버는 요청을 승낙, 클라이언트에 응답
- ACK: 클라이언트는 서버의 응답을 확인후, 연결을 진행
소켓통신은 읽기(Receive)와 쓰기(Send)로 이뤄지며, 이는 파일 시스템에서 파일을 읽고 쓰는 것과 유사
데이터 전송 과정
- 읽기
3way handshake
client
server
소켓 == 파일
서버 == 프로세스
소켓통신 == 읽기 or 쓰기
| 읽기 Receive | 쓰기 Send |
IO
하드안에 파일이 들어있는데 파일은 파일시스템에 의해 관리가 되며
메모리 할당 파일에서 읽어올때 64kb로 끊어서 읽어옴 파일이 1.4MB짜리를 가져올 때 파일을 끊어서 가져옴 (퍼즐이 쌓이듯) 메모리에 가져온다
// 1. READ 파일을 먼저 읽는다.
버퍼간 카피가 일어남 Buffered I/O TCP에서 IP쪽으로 내려갈 때 Segment 단위로 분할 나눠진 Segment를 패킷에 담아 처리되는데 분할된 Segment는 분할된 Segment는 Packet이라는 박스에 담겨 처리되고, Packet이라는 박스들은 Frame이라는 각기 다른 트럭에 적재되어 운반된다
파일에 연결된 버퍼가 있음
클라이언트로 전달이되면 Ack날리지먼트 응답 (1번2번 잘받았으니 3번을 보내!)
1,2번을 배송한 서버는 클라이언트에게 프레임을 보낸뒤 잘받았다라는 응답을 기다리고, 클라이언트로부터 응답을 받았으면 다음프레임을 이어서 전송한다. 이 과정이 반복된다.
이 기다림때문에 속도에 지연현상이 발생한다. TCP/IP 가 UDP 보다 느리다는 이유중 하나가 바로 이문제를 안고있기 때문
Window Size: 수신측에서 세그먼트가 날라오면 조립할 수 있는 공간 해당 사이즈는 정해져있지만 Ack Include 윈도우 사이즈를 포함하고있음 전송을 할 때 수신측의 윈도우사이즈를 보내는데 Maximum segment size 보다 큰가? > YEs 라면 전송을 진행 NO > wait
서버가 느린것이 아니고, 수신하는 클리이언트가 계속해서 채워짐
Receive 속도가 느림 Read속도가 네트워크 수신속도보다 느린경우 Window 사이즈가 줄어듦으로 서버에서 더이상 보낼 수 없는 현상이 일어남 (병목) 그래서 Read속도가 중요 > 이는 처리지연의 문제로 이어짐
프로그램에서 원인을 찾아야 함 네트워크로부터 데이터가 왔음
물리계층에서 전송계층으로 프레임을 언박싱해 패킷을 꺼내고,
물리계층에서 프레임 Decaptulation(언박싱)하고,
IP 계층에서 프레임으로부터 패킷을 꺼내고
트럭에 목적지는 어디인가??