2022. 4. 5. 11:55ㆍNetwork
# TCP -> 4계층 프로토컬에 해당하며 헤더의 길이는 기본 20바이트 옵션까지 포함하면 최대 60바이트로 구성되어있음.
HEADER DATA
- Source port(16bits)
출발지 포트번호[번호는 처음 세그먼트를 전송하는 측에서 임의의 번호를 사용하므로 랜덤일 수 있음]
- Destination port(16bits)
목적지 포트번호
ex) 웹에 접근 -> 80번 port, ftp -> 21번, ssh -> 22번
- Sequence number(32bits)
데이터들의 순서들을 의미하며 2^32인 4,294,967,296까지의 수를 포함하기 때문에 데이터순서값이 중복될 확률 낮음.
시퀀스 번호는 양쪽의 TCP 소프트웨어가 전송된 데이터의 양을 추적하고 잘못된 순서로 수신된 경우 데이터를 올바른 순서로 되돌리고 전송 중 손실된 데이터를 요청하는 데 도움을 줌. 보내는 데이터 1바이트마다 시퀀스 번호를 1씩 증가시키는데 2^32인 4,294,967,296를 넘어가게 되면 다시 0부터 시작함
- Acknowledgement number(32bits)
송신자가 보낸 데이터를 수신하여 오류가 없으면 시퀀스 번호를 1증가하여 정확한 데이터의 수신 확인을 알려줌
Ack number == Sequence number + 데이터길이 ex) SYN = 100 -> AN = 100 + 1
- Offsets(4bits)[=HLEN]
Offsets의 끝 = 데이터가 시작되는 위치를 보여줌
옵션필드 값이 고정되어있지 않기 때문에 이 필드가 필요함
- Reserved(6bits)
미래에 사용하기 위해 남겨둔 예비 필드로 0으로 채워져야 함
-> 0|0|0
- TCP flags(8bits)
CWR : 혼잡 윈도우 크기의 감소
ECN : 혼잡을 알려줌
URG : 긴급 포인터이고 이 비트가 설정되면 데이터는 다른 데이터보다 우선적으로 처리됨
ACK : 승인에 사용됨
PSH : 푸시 기능 역할을 하고 데이터가 즉시 전송되어야 하며 전체 TCP 세그먼트를 채울 때까지 기다리기를 원하지 않는다는 것을 애플리케이션에 알려줌
RST : 이것은 연결을 재설정을 하고 수신하면 즉시 연결을 종료해야 함 이것은 복구할 수 없는 오류가 있고 TCP 연결을 완료하는 일반적인 방법이 아닌 경우에만 사용됨
SYN : 상대방과 연결을 생성하고 초기 시퀀스 번호를 설정하는 데 사용됨. 즉 동기화를 시작하고 가장 중요한 플래그
FIN : 종료 비트로 TCP 연결을 종료하는 데 사용됨. TCP는 전이중이므로 양 당사자는 연결을 종료하기 위해 FIN 비트를 사용하고 연결을 종료하는 일반적인 방법임
- Window(16bits)
한번에 전송할 수 있는 데이터의 양을 의미하는 값을 담음[2^16->65535]. 만약 windowsize가 3000이라면 한번에 3000이상의 크기의 데이터를 보낼 수 없음.
tcp전송속도가 느려 나온 보안책.
흐름제어 = 데이터 전송량을 제어함[송신자와수신자와 협의해가면서]
3WHS과정때 처음 등장하며 데이터를 받는쪽의 h/w용량에 따라 os가 알아서 결정을 시켜줌.
- Checksum(16bits)
TCP헤더가 정상인지 확인하고 전송할 데이터를 16비트씩 쪼개어서 차례대로 더한다음 계산함
초과된 값은 16비트로 세팅된 값 뒤에 둔 다음 2의 비트로 변환하여 1의 보수로 변경함
ex) (16비트는 길어서 8비트로 예시) 10000010 + 10000100 -> 110000101
오버된 값 1을 떼어내서 다시 더함 -> 10000101 +1 = 10000111 -> 1의 보수로 변경 -> 01111000
- Urgent Pointer(16bits)
긴급하게 처리해야하는 데이터들을 포함함
1이라면 포인터가 가르키고 있는 데이터를 우선적으로 처리함
- Options
선택사항이며 TCP기능을 확장시키고 싶을때 사용함
고정적이지 않고 옵션 선택사항들에 따라 이 필드의 크기가 바뀜
type 0 no more options
type 1 no operation
type 3 (WSCALE,Window Scale factor 또는 WSOPT) : 3 바이트
TCP 헤더 내 윈도우 크기 필드 값을 윈도우 스케일 옵션 값(비트) 만큼 시프트하여 크기 스케일을 변환시킴
type 4 (SACK Permitted,Selective Acknowledgment Permitted) : 2 바이트
선택 확인응답(SACK) 옵션 허용
여러 패킷 중 손실된 패킷 만 선택적으로 재전송하기 위한 TCP 연결 설정 시의 협상 옵션
type 5 (Selective Acknowledgment Data) : 가변
선택 확인응답(SACK) 옵션 데이터
수신측에서 손실되어 재전송을 원하는 불연속적인 세그먼트 블록을 명시하기 위함
type 8 (Timestamp) : 10 바이트
타임스탬프 옵션
type 28 (UTO, User Timeout) : 4 바이트
사용자 타임아웃
type 29 (TCP-AO) : 가변
인증 옵션
# TCP연결관리
1. 3WHS과정[서버/클라이언트 초기화]
- 클라이언트 연결요구 -> 서버 측 응답 및 연결요구 -> 서버 연결 요구에 대한 클라이언트 쪽의 최종응답
1번에 SYN플래그 값이1과 SYN넘버가 767로 서버로 전달.
서버는 ACK넘버에 데이터길이 1[default]을 더해 768과 응답플래그 ack값 1을 보내 응답을 함. 동시에 새로운 SYN넘버와 SYN 플래그값을 1로해 받을 준비됐냐는 요청을함.
마지막으로 클라이언트는 서버에 응답하기 위해 ACK=1, SYN넘버 + 1인 ACK넘버 값을 보내서 응답함. 이때 클라이언트는 서버에 다시 질문을 할 필요가 없으므로 Seq=0, SYN넘버를 전에받은 ACK넘버를 그대로 사용함.
2. TCP 데이터 전송과정
3WSH 과정이 끝난다음 송, 수신지 간의 통신이 가능하면 4번부터 송신지는 데이터[HTTP]를 요청할 수 있음. 5번에 수신지는 데이터를 잘 받았다고 TCP를 통해 송신지에게 알려줘야됨. 응답일 뿐 5번에서도 역시 데이터는 들어가있지 않음. 6, 7번부터는 본격적으로 송신지의 데이터를 전달함.
3.TCP연결종료[=4WHS]
1번은 송신지와 수신지의 통신이 종료될때 송신지는 수신지에게 FIN플래값을 던져 종료의 신호를 알림
이때 FIN_WAIT가 송신자쪽에서 나타남.
2번은 수신자쪽은 FIN플래그 응답을 받고 송신지쪽에 데이터를 주기위해 할당했던 프로세스를 종료하는 단계로 들어감.
이떄 송신자에게 알아들었다고 응답을 줄면서 종료가 되었으면 LAST_ACK단계로 들어가 FIN플래그를 줌.
6번에서 TIME_WAIT가 나타나는데 FIN플래그를 받는 송신자가 바로 Virtual line을 안끊고 7번이 되야 C -> S의 Virtual line이 끊긴다. 즉 먼저 S->C Virtual line이 끊기도 그다음 C -> S라인이 끊긴다.[이유는 만약 송신지 측에서 먼저 끊었는데 수신자가 ack를 받지 못한 경우라면 수신자는 계속 FIN플래그를 보내 작업종료가 안됨].
즉 TIME_WAIT를 통해 일정시간 기다림을 통해 수신지에서 ack를 받지못해 다시 FIN을 보내는 경우를 고려하여 통신의 확실한 종료를 위한 것으로 보임.
'Network' 카테고리의 다른 글
DNS (0) | 2022.04.08 |
---|---|
Udp header (0) | 2022.04.06 |
Ipv6 header (0) | 2022.04.04 |
IPv4 header (0) | 2022.04.04 |
Proxy (0) | 2022.03.27 |