티스토리 뷰

 

이번 포스팅에서는 HTTP 완벽가이드네트워킹과 웹 성능 최적화 기법, 리눅스 커널 이야기, 와이어샤크를 활용한 실전 패킷 분석 책을 활용하였습니다.

4장 Connection 관리

1. TCP Connection이란

 

HTTP가 메시지를 전송하고자 할 경우, 현재 연결되어 있는 TCP Connection을 통해서 메시지 데이터의 내용을 순서대로 보낸다. TCP는 Segment라는 단위로 데이터 스트림을 잘게 나누고, Segment를 IP Packet이라고 불리는 작은 조각에 담아서 인터넷을 통해 전달한다.

 

1) TCP와 IP

IP(Internet Protocol)은 3계층의 프로토콜로 서로 연결된 네트워크의 인터네트워크를 통해 패킷(3계층의 PDU는 패킷 데이터그램)을 전달하는 목적으로 사용

특징 설명
비신뢰성 IP 패킷이 목적지에 성공적으로 도달했다는 것을 보장하지 않음
비연결성 전달되는 패킷에 대해 상태정보를 유지하지 않으며, 각 패킷은 독립적으로  처리
주소지정 각 네트워크 상에 접속해 있는 노드의 주소를 지정해서 데이터를 전송할 목적지를 지정
경로설정 목적지의 주소를 가지고 패킷을 전송하기 위하여 최적 경로를 설정해주는 역할

IP Header

- Identifier: 데이터가 단편화되었을 경우 목적지에서 원래의 데이터로 재조립할 수 있게 만들기 위해 원래 데이터의 식별자를 표시

- Fragmentation Flag: 분열의 특성을 나타내는 flag (DF: 상위 계층에서 받은 데이터를 단편화할 것인지 판단, MF: IP 패킷 뒤에 단편화가 더 있는지 나타냄)

- Fragmentation Offset: 단편화가 된 경우 데이터를 순서대로 재조립하기 위해 사용

- TTL: IP 패킷의 수명

- Protocol Identifier: 어느 상위 계층 프로토콜이 데이터 내에 포함되었는지를 보여줌

 

TCP(Transmission Control Protocol)는 신뢰할 수 없는 채널 위에 신뢰성을 구축한 추상 계층이다. 이는 네트워크 통신 구현에 필요한 유실 데이터 재전송, 전송 순서 확인, 혼잡 제어 및 회피 데이터 무결성 확인 같은 복잡한 기능을 투명하게 처리하여 애플리케이션 구현을 한결 쉽게 만들어준다. 

특징 설명

프로세스간 통신

TCP는 UDP처럼 포트번호를 사용하여 프로세스간 통신을 제공

스트림 전송 서비스

TCP에서 송신 프로세스는 바이트의 흐름으로 데이터를 전달하고 수신 프로세스도 바이트의 흐름으로 데이터를 수신하도록 만듦

송신/수신 버퍼

송신/수신 프로세스는 똑같은 속도로 데이터를 만들고 처리할 수 없기 때문에 TCP는 저장을 위해 버퍼가 필요하며, 각 방향을 위해 송신/수신 두가지 버퍼가 존재

세그먼트

세그먼트라고 하는 패킷으로 다수의 바이트를 묶어서 그룹화

전이중 통신

TCP는 전이중 통신을 제공하여 데이터는 동시에 양방향으로 전달 가능

연결지향 서비스

UDP와 달리 TCP는 연결지향 프로토콜

TCP 세그먼트는 IP 패킷으로 캡슐화되어 순서가 뒤바뀌는 경우, 손실/손상되는 경우 재전송함

신뢰성있는 서비스

TCP는 데이터가 안전하게 도착했는지 확인하기 위해 확인 응답기법을 사용

TCP Header

제어비트

설명

TCP Flag

C,E

혼잡제어시 사용

URG

긴급 포인터(Urgent Pointer)가 있음을 표시

ex) telnet에서 Ctrl + c 등의 인터럽트형 명령 전송시

ACK

Acknoledgement Number 사용중을 의미

PSH

Telnet 등의 실시간 대화형 데이터를 상위계층(응용계층)으로 전송하여 처리 요구

RST

연결 재설정, 포트가 닫혔을 때 에러 메시지 

ex) 포트스캐닝 등

SYN

연결을 초기화하기 위해 순서번호를 동기화

FIN

송신 측이 데이터 전송을 종료함(연결 해제)

Window

수신자 측이 받을 수 있는 데이터 사이즈를 수신자 축에서 송신자 측으로 전송하는 값

Checksum

TCP 헤더 데이터를 포함한 세그먼트 전체에 대한 계산값(에러체크)

Urgent Pointer

긴급히 처리해야 할 필요가 있는 데이터의 마지막 Byte 위치


2) TCP 3way handshake

1) Client는 Server에 접속을 요구하는 SYN 패킷을 전송하는데, 이 때 Client는 SYN을 보낸 후 SYN/ACK응답을 기다리는 SYN_SENT 상태 (Seq는 랜덤, Ack는 Seq + 1)

2) Server는 SYN 요청을 받고 Client에게 요청을 수락한다는 ACK와 SYN Flag가 설정된 패킷을 발송 후 다시 ACK 응답을 기다리며, 이 때 Server는 SYN_RECEIVED 상태

3) Client는 Server에게 ACK를 보내고 이후부터 연결이 이루어지고 데이터를 전송하며 이 때 Server의 상태는 ESTABLISHED


3) TCP 4way handshake

1) 통신을 종료하고자 하는 Client는 Server에게 FIN Flag를 세팅한 패킷을 전송 후 FIN_WAIT_1 상태

2) FIN을 수신한 Server는 ACK를 Client에게 전송하고 소켓의 상태를 CLOSE_WAIT_2로 변경

3) ACK를 수신한 Client는 Server가 FIN을 잘 받았다고 생각하고 FIN_WAIT_2로 소켓의 상태 변경 후 다시 FIN 패킷을 기다림

4) ACK를 Client에게 전송한 Server는 다시 FIN 패킷을 Client로 전송 후 소켓을 LAST_ACK상태로 변경

5) FIN을 수신한 Client는 Server에게 ACK를 전송 후 소켓의 상태를 TIME_WAIT 상태로 변경

 

 

 

 

 

 

 

 

 

댓글
링크
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday